行为型对象模式——责任链模式

责任链模式是一种行为型设计模式,其核心思想是将请求的发送者与接收者解耦,通过将多个处理者对象串联成一条链,请求沿着链传递,直到被某个处理者处理为止。

适用于

①有多个的对象可以处理一个请求,哪个对象处理请求运行时刻自动确认。

②想在不明确指定接收者的情况下向多个对象中的一个提交一个请求。

③可处理一个请求的对象集合应被动态指定

类图如下

    internal class Program
    {
        static void Main(string[] args)
        {
            //创建请假对象
            LeaveRequest leave = new LeaveRequest("小米", 6, "外出");

            //创建领导对象
            GroupHandler group = new GroupHandler();
            ManagerHandler manager = new ManagerHandler();
            GeneralHandler general = new GeneralHandler();

            //设置责任链
            group.SetHandler(manager);
            manager.SetHandler(general);

            //小米提交请假
            group.Submit(leave);


        }
    }
 1     /// <summary>
 2     /// 请假条类
 3     /// 在责任链中进行流转
 4     /// </summary>
 5     internal class LeaveRequest
 6     {
 7         public string Name { get; }
 8 
 9         public int Num { get; }
10 
11         public string Content { get; }
12 
13         public LeaveRequest(string name, int num, string content)
14         {
15             Name = name;
16             Num = num;
17             Content = content;
18         }
19     }
View Code
 1     /// <summary>
 2     /// 抽象处理者类
 3     /// </summary>
 4     internal abstract class Handler
 5     {
 6         protected readonly static int NUM_ONE = 1;
 7         protected readonly static int NUM_THREE = 3;
 8         protected readonly static int NUM_SEVEN = 7;
 9 
10         private int numStart;
11         private int numEnd;
12 
13         //上级处理者
14         private Handler handler;
15 
16         public Handler(int numStart)
17         {
18             this.numStart = numStart;
19         }
20 
21         public Handler(int numStart, int numEnd)
22         {
23             this.numStart = numStart;
24             this.numEnd = numEnd;
25         }
26 
27         //设置上级领导对象
28         public void SetHandler(Handler handler)
29         {
30             this.handler = handler;
31         }
32 
33         //处理请假条方法
34         public abstract void HangdleLeave(LeaveRequest request);
35 
36         public void Submit(LeaveRequest request)
37         {
38             this.HangdleLeave(request);
39             if(this.handler != null && request.Num > numEnd)
40             {
41                 this.handler.Submit(request);
42             }
43             else
44             {
45                 Console.WriteLine("流程结束!");
46             }
47         }
48     }
View Code
 1     internal class GroupHandler : Handler
 2     {
 3         public GroupHandler() : base(0, NUM_ONE)
 4         {
 5         }
 6 
 7         public override void HangdleLeave(LeaveRequest request)
 8         {
 9             Console.WriteLine(request.Name + "请假" + request.Name + "天," + request.Content + "");
10             Console.WriteLine("小组长审核:同意");
11         }
12     }
View Code
 1     internal class ManagerHandler : Handler
 2     {
 3         public ManagerHandler() : base(NUM_ONE, NUM_THREE)
 4         {
 5         }
 6 
 7         public override void HangdleLeave(LeaveRequest request)
 8         {
 9             Console.WriteLine(request.Name + "请假" + request.Name + "天," + request.Content + "");
10             Console.WriteLine("部门经理审核:同意");
11         }
12     }
View Code
 1     internal class GeneralHandler : Handler
 2     {
 3         public GeneralHandler() : base(NUM_THREE, NUM_SEVEN)
 4         {
 5         }
 6 
 7         public override void HangdleLeave(LeaveRequest request)
 8         {
 9             Console.WriteLine(request.Name + "请假" + request.Name + "天," + request.Content + "");
10             Console.WriteLine("总经理审核:同意");
11         }
12     }
View Code

 

posted @ 2025-04-21 21:58  是铭不是明  阅读(18)  评论(0)    收藏  举报