责任链模式

定义

某事件涉及多个对象顺序的处理,其一种职责工作的传递。引入以责任为对象,以相关职责对象之间进行统一接口对象的传递,避免发起者与接收者的高耦合。

实际中责任链的存在是很普遍的,例如经常涉及到的审批流就比较经典,请假的审批流程就是一例:个人申请--经理审批---认识审批记录--总经理审批。

类图

其中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     }
View Code

总结

责任链模式注重于责任对象之间的责任传递,区别于命令模式与状态模式。

Top
收藏
关注
评论
原文地址:https://www.cnblogs.com/Joy-et/p/4868688.html