zoukankan      html  css  js  c++  java
  • 设计模式之(十四)责任链模式(Chain of Responsibility)

      在业务场景中,有很多是需要审批的。审核方式还可能常常发生变化,而责任链模式就是为了解决这种场景的情况的。

      责任链模式定义:十多个对象都有机会处理请求,从而避免发送者和接受者之间的耦合关系。讲这些对象连成一条链,并沿着这条链传送这个请求,直到有一个对象处理他为止。 

      责任链模式的思想就是把处理请求的处理都拆开,一个处理逻辑封装成一个小颗粒类,在需要使用的时候就可以按照业务需要排序起来处理,就像一个链条。但是在这个过程中可能走完了也没有得到处理,这就需要给出一个默认的处理,而给出处理结果。接下来看看此模式的类图:

    从这个图里可以看出来,这个模式和递归算法很大关系,接下来通过一个例子来加深对此模式的理解。

     1 /***
     2  * 处理类的抽象类
     3  * @author pwq
     4  */
     5 public abstract class Handle {
     6     protected Handle successor = null;
     7 
     8     public void setSuccessor(Handle successor) {
     9         this.successor = successor;
    10     }
    11     
    12     public abstract    String handleFeeRequest(String user,double fee);
    13     
    14 }
    15 
    16 /***
    17  * 其中一个处理逻辑类
    18  * @author pwq
    19  */
    20 public class ProjectManager extends Handle {
    21 
    22     @Override
    23     public String handleFeeRequest(String user, double fee) {
    24         // TODO Auto-generated method stub
    25         String str ="" ;
    26         if(fee < 500){
    27             if("小李".equals(user)){
    28                 str = "项目经理同意"+user+"申请的聚餐费用 "+ fee +" 元";
    29             }
    30             else{
    31                 str =  "项目经理不同意"+user+"申请的聚餐费用 "+ fee +" 元";
    32             }
    33         }
    34         else{
    35             if(successor != null)
    36                 str = successor.handleFeeRequest(user, fee);
    37         }
    38         return str;
    39     }
    40 }
     1 /***
     2  * 处理逻辑类
     3  * @author pwq
     4  *
     5  */
     6 public class DeptManager extends Handle {
     7 
     8     @Override
     9     public String handleFeeRequest(String user, double fee) {
    10         // TODO Auto-generated method stub
    11         String str ="" ;
    12         if(fee < 1000){
    13             if("小李".equals(user)){
    14                 str = "部门经理同意"+user+"申请的聚餐费用 "+ fee +" 元";
    15             }
    16             else{
    17                 str =  "部门经理不同意"+user+"申请的聚餐费用 "+ fee +" 元";
    18             }
    19         }
    20         else{
    21             if(successor != null)
    22                 str = successor.handleFeeRequest(user, fee);
    23         }
    24         return str;
    25     }
    26 }
    DeptManager 处理逻辑类
     1 public class GeneralManager  extends Handle {
     2 
     3     @Override
     4     public String handleFeeRequest(String user, double fee) {
     5         // TODO Auto-generated method stub
     6         String str ="" ;
     7         if(fee >= 1000){
     8             if("小李".equals(user)){
     9                 str = "总经理同意"+user+"申请的聚餐费用 "+ fee +" 元";
    10             }
    11             else{
    12                 str =  "总经理不同意"+user+"申请的聚餐费用 "+ fee +" 元";
    13             }
    14         }
    15         else{
    16             if(successor != null)
    17                 str = successor.handleFeeRequest(user, fee);
    18         }
    19         return str;
    20     }
    21 }
    GeneralManager 处理逻辑类
     1 public class Client {
     2 
     3     public static void main(String[] args) {
     4         // TODO Auto-generated method stub
     5         Handle h1=new ProjectManager();
     6         Handle h2 = new DeptManager();
     7         Handle h3 = new GeneralManager();
     8         
     9         h1.setSuccessor(h2);
    10         h2.setSuccessor(h3);
    11         
    12         String str = h1.handleFeeRequest("万小弟", 600);
    13         System.out.println(str);
    14         String str2 = h1.handleFeeRequest("彭大哥", 1800);
    15         System.out.println(str2);
    16         String str3 = h1.handleFeeRequest("小李", 400);
    17         System.out.println(str3);
    18     }
    19 }
    20  
    21 
    22 /*****************************************************/
    23 
    24 部门经理不同意万小弟申请的聚餐费用 600.025 总经理不同意彭大哥申请的聚餐费用 1800.026 项目经理同意小李申请的聚餐费用 400.0 元

       通过这个例子分析处理类的写法,如果从抽象类来看的话,就是递归算法来达到让每个逻辑都有机会处理请求的。要类里面要定义下个环节处理的逻辑类变量,在使用的时候通过这个设置来组成处理的链。

      例子展示的是责任链,也就是典型的审批的流程这样场景。还有另外一种用法,就是功能链,功能链就是把从多功能拆分到单一功能类中,可以根据需要来调用,相对来说更灵活,也便于复用。

    责任链的有点和缺点

      优点就是:

          1、把复杂功能拆分处理,让每个类只是负责一个处理逻辑。复用性更好,组合更加灵活。

          2、请求和处理类分开,实现低耦合,更加利于扩展。

      缺点:小颗粒类大幅膨胀。

    模式的本质

      分离职责,动态组合

  • 相关阅读:
    014.Python函数
    013.Python的文件操作
    012.Python的字典和集合的相关函数
    011.Python的列表的相关操作
    010.Python字符串的格式化
    009.Python字符串相关函数
    008.Python循环for循环
    007.Python循环语句while循环嵌套
    Java 反射机制 初探*
    Java 正则初探
  • 原文地址:https://www.cnblogs.com/pengweiqiang/p/11354740.html
Copyright © 2011-2022 走看看