• 责任链模式(Chain of Responsibility、Handler)(请求处理建立链)


    (使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。)  

        从名字中看出 ,系统中将会存在多个有类似处理能力的对象,当一个请求触发后,请求将在这些对象组成的链条中传递直到找到最合适的处理对象,并进行处理。

          责任链模式是一种对象的行为模式,通常分为纯的责任模式和不纯的责任模式。

    纯的责任链模式:

          要求一个对象处理者只能选择不处理或者处理全部。且要求一个请求必须被某一个处理者所处理,不能出现请求为被处理的情况。

    不纯的责任链模式:

       允许一个请求被某个处理者处理部分,在向后传递。且一个请求允许不被任何处理者所处理。

       假设在一个公司中某职员需要向上级申请资金主要有  项目经理、部门经理、总经理可以批准。 其中项目经理可批准500以内,部门经理可批准1000以内的,总经理可以批准任何资金。

        在不使用责任链模式时我们可以用if else 一一作出判断,而如果后来的申请流程发生改变,我们必须对原有的判断逻辑作出修改。

        使用责任链模式时我们可以将各个处理对象连成链而随意组合,而在以后发生变动时我们只需要对链的顺序做出重组,而不需要修在原来的逻辑代码。

    抽象处理者:

     1 public abstract class Handler {
     2 protected  Handler successor = null; //用于组成处理链
     3 
     4 public Handler getSuccessor() {
     5     return successor;
     6 }
     7 
     8 public void setSuccessor(Handler successor) {
     9     this.successor = successor;
    10 }
    11 public abstract String handlerFeeRequest(String user,double fee);//处理函数
    12 
    13 }

    具体处理者:

     1 public class ProjectManager extends Handler {
     2 
     3     @Override
     4     public String handlerFeeRequest(String user, double fee) {
     5     String str= null;    
     6     if (fee<=500) {
     7     str = "项目经理同意 ,费用为:" + fee;  //如果五百以内项目经理可以处理
     8     }else {
     9         str = successor.handlerFeeRequest(user, fee);//超过五百需要交给他人处理
    10     }
    11         return str;
    12     }
    13 
    14 }
     1 public class DeptManager extends Handler {
     2 
     3 
     4         @Override
     5         public String handlerFeeRequest(String user, double fee) {
     6         String str= null;    
     7         if (fee<=1000) {
     8         str = "部门经理同意, 费用为:" + fee;  //如果一千以内部门经理可以处理
     9         }else {
    10             str = successor.handlerFeeRequest(user, fee);//超过一千需要交给他人处理
    11         }
    12             return str;
    13         }
    14 
    15     
    16     
    17 
    18 }
     1 public class GeneralManager extends Handler{
     2 
     3 
     4     @Override
     5     public String handlerFeeRequest(String user, double fee) {
     6     String str= null;    
     7     
     8     str = "总经理同意, 费用为:" + fee;  //总经理经理可以处理任意数目
     9     
    10         return str;
    11     }
    12 
    13 
    14 }

    客户测试类:

     1 import javax.swing.text.html.HTMLDocument.HTMLReader.HiddenAction;
     2 
     3 public class ResponsibilityChain {
     4 
     5     public static void main(String[] args) {
     6         
     7         Handler h1 = new ProjectManager();//创建项目经理
     8         Handler h2 = new DeptManager();//创建部门经理
     9         Handler h3 = new GeneralManager();//创建总经理
    10         
    11         /*
    12          * 建立处理链
    13          */
    14             h1.setSuccessor(h2);
    15             h2.setSuccessor(h3);
    16          /*
    17           * 处理  
    18           * 统一的调用    h1 作为请求入口   如果不做出标注  客户不会知道具体的处理者是谁 
    19           */
    20             String resault;
    21              resault = h1.handlerFeeRequest("张三",400);
    22              System.out.println(resault);
    23              resault = h1.handlerFeeRequest("张三",800);
    24              System.out.println(resault);
    25              resault = h1.handlerFeeRequest("张三",1200);
    26              System.out.println(resault);
    27     }
    28 
    29 }

    运行结果:

    项目经理同意 ,费用为:400.0
    部门经理同意, 费用为:800.0
    总经理同意, 费用为:1200.0
  • 相关阅读:
    JQuery autocomplete选中某项后触发事件
    Javascript类的写法
    windows2003里的数据库没被访问到
    SQL SERVER 2008 评估期已过,哪位大哥有解决方法?
    js对json增删改查操作
    javascript 谁才是initialize方法
    JavaScript的写类方式(1)
    我所收集的googlemap 应用实例
    经典的正则表达式工具Regulator使用教程(图文)
    Map的使用
  • 原文地址:https://www.cnblogs.com/the-wang/p/7288893.html
Copyright © 2020-2023  润新知