• 责任链模式


    定义

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

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

    类图

    其中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
    收藏
    关注
    评论
  • 相关阅读:
    APP调用微信支付
    怎么在腾讯云上部署项目
    Jfinal中使用redis
    Jfinal框架中使用WebSocket
    一道sql面试题
    git本地仓库上传到git远程仓库的指令
    怎么启动postsqlgres
    SpringMVC用List接收请求参数
    转发 电商面试题100问
    转--MyBatis-Plus代码自动生成工具
  • 原文地址:https://www.cnblogs.com/Joy-et/p/4868688.html
Copyright © 2020-2023  润新知