Administrator
发布于 2024-08-03 / 38 阅读
0
0

职责链模式

问题描述

加薪、请假申请会有层层审批的场景,比如向经理提出加薪申请,如果经理没有权限会上报给总监,总监如果没有权限会上报给总经理。

代码实现

请求类

    public class Request
    {
        public string RequestType { get; set; }
        public string RequestContent { get; set; }
        public int Number;
    }

经理抽象类

    public abstract class Manager
    {
        protected string mName;
        protected Manager mSuperiorManager;

        public Manager(string name)
        {
            mName = name;
        }

        public void SetSuperiorManager(Manager superiorManager)
        {
            mSuperiorManager = superiorManager;
        }

        public abstract void RequestApplications(Request request);
    }

经理相关具体实现类

public class CommonManager : Manager
{
    public CommonManager(string name) : base(name) { }

    public override void RequestApplications(Request request)
    {
        if (request.RequestType == "请假" && request.Number <= 2)
        {
            Console.WriteLine($"{mName}:{request.RequestContent} 数量{request.Number} 被批准");
        }
        else
        {
            if (mSuperiorManager != null)
            {
                mSuperiorManager.RequestApplications(request);
            }
        }
    }

}

public class MajorManager : Manager
{
    public MajorManager(string name) : base(name) { }
    public override void RequestApplications(Request request)
    {
        if (request.RequestType == "请假" && request.Number <= 5)
        {
            Console.WriteLine($"{mName}:{request.RequestContent} 数量{request.Number} 被批准");
        }
        else
        {

           if (mSuperiorManager != null)
            {
                mSuperiorManager.RequestApplications(request);
            }
        }
    }
}

public class GeneralManager : Manager
{
    public GeneralManager(string name) : base(name) { }
    public override void RequestApplications(Request request)
    {
        if (request.RequestType == "请假")
            Console.WriteLine($"{mName}:{request.RequestContent} 数量{request.Number} 被批准");
        else if (request.RequestType == "加薪" && request.Number<=5000)
            Console.WriteLine($"{mName}:{request.RequestContent} 数量{request.Number} 被批准");
        else
        {
            Console.WriteLine($"{mName}:{request.RequestContent} 数量{request.Number} 太多了,不批准");
        }
    }
}

Main方法

    internal class Program
    {
        static void Main(string[] args)
        {
            Manager manager = new CommonManager("经理");
            Manager majorManager = new MajorManager("总监");
            manager.SetSuperiorManager(majorManager);
            Manager generalManager = new GeneralManager("总经理");
            majorManager.SetSuperiorManager(generalManager);

            Request request = new Request();
            request.RequestType = "请假";
            request.RequestContent = "小菜申请请假";
            request.Number = 1;
            manager.RequestApplications(request);

            request.RequestType = "请假";
            request.RequestContent = "小菜申请请假";
            request.Number = 10;
            manager.RequestApplications(request);

            request.RequestType = "加薪";
            request.RequestContent = "小菜申请涨薪";
            request.Number = 5000;
            manager.RequestApplications(request);

        }
    }

执行结果

经理:小菜申请请假 数量1 被批准
总经理:小菜申请请假 数量10 被批准
总经理:小菜申请涨薪 数量5000 被批准

UML图


评论