定义
某事件涉及多个对象顺序的处理,其一种职责工作的传递。引入以责任为对象,以相关职责对象之间进行统一接口对象的传递,避免发起者与接收者的高耦合。
实际中责任链的存在是很普遍的,例如经常涉及到的审批流就比较经典,请假的审批流程就是一例:个人申请--经理审批---认识审批记录--总经理审批。
类图
其中handler为责任链的统一基类,继承自它的派生类为具体的责任对象,当某一责任对象处理完成后将责任对象指向下一个。
而其中HandlerFactory则是责任链的创建工厂,因为责任链本身应该是设定好的,而不是Client自己直接去创建的。
代码
1 public abstract class Handler 2 { 3 private Handler successor = null; 4 public Handler Successor 5 { 6 get 7 { 8 return this.successor; 9 10 } 11 set 12 { 13 this.successor = value; 14 } 15 } 16 public abstract void HandleRequest(decimal fee); 17 } 18 19 public class GroupHandler : Handler 20 { 21 public GroupHandler(Handler handler) 22 { 23 this.Successor = handler; 24 } 25 public override void HandleRequest(decimal fee) 26 { 27 if (Successor != null) 28 { 29 Successor.HandleRequest(fee); 30 } 31 } 32 } 33 public class ManagerHandler : Handler 34 { 35 public ManagerHandler(Handler handler) 36 { 37 this.Successor = handler; 38 } 39 public override void HandleRequest(decimal fee) 40 { 41 if (fee > 3000) 42 { 43 Console.WriteLine("小组申请费用不可以超过3000元"); 44 return; 45 } 46 Console.WriteLine("经理审批通过"); 47 if (Successor != null) 48 { 49 Successor.HandleRequest(fee); 50 } 51 } 52 } 53 public class BossHandler : Handler 54 { 55 public BossHandler(Handler handler) 56 { 57 this.Successor = handler; 58 } 59 public override void HandleRequest(decimal fee) 60 { 61 if (fee > 2500) 62 { 63 Console.WriteLine("小组申请费用不可以超过3000元"); 64 return; 65 } 66 Console.WriteLine("总经理审批通过"); 67 if (Successor != null) 68 { 69 Successor.HandleRequest(fee); 70 } 71 } 72 } 73 74 public class FinacialHnadler : Handler 75 { 76 public FinacialHnadler(Handler handler) 77 { 78 this.Successor = handler; 79 } 80 public override void HandleRequest(decimal fee) 81 { 82 Console.WriteLine("财务发放资金:"+fee.ToString()); 83 if (Successor != null) 84 { 85 Successor.HandleRequest(fee); 86 } 87 } 88 } 89 90 public class HandlerFactory 91 { 92 /// <summary> 93 ///责任链的创建 94 /// </summary> 95 /// <returns></returns> 96 public static Handler CreateHandler() 97 { 98 Handler finacialHandler = new FinacialHnadler(null); 99 Handler bossHandler = new BossHandler(finacialHandler); 100 Handler managerHandler = new ManagerHandler(bossHandler); 101 Handler groupHandler = new GroupHandler(managerHandler); 102 return groupHandler; 103 } 104 } 105 106 public class Client 107 { 108 public void ApplyFee() 109 { 110 HandlerFactory.CreateHandler().HandleRequest(2600); 111 } 112 }
总结
责任链模式注重于责任对象之间的责任传递,区别于命令模式与状态模式。