责任链模式(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
原文地址:https://www.cnblogs.com/the-wang/p/7288893.html