行为型对象模式——责任链模式
责任链模式是一种行为型设计模式,其核心思想是将请求的发送者与接收者解耦,通过将多个处理者对象串联成一条链,请求沿着链传递,直到被某个处理者处理为止。
适用于
①有多个的对象可以处理一个请求,哪个对象处理请求运行时刻自动确认。
②想在不明确指定接收者的情况下向多个对象中的一个提交一个请求。
③可处理一个请求的对象集合应被动态指定
类图如下

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 }
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 }
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 }
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 }
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 }

浙公网安备 33010602011771号