顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。
在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。
意图:避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。
主要解决:职责链上的处理者负责处理请求,客户只需要将请求发送到职责链上即可,无须关心请求的处理细节和请求的传递,所以职责链将请求的发送者和请求的处理者解耦了。
何时使用:在处理消息的时候以过滤很多道。
如何解决:拦截的类都实现统一接口。
关键代码:Handler 里面聚合它自己,在 HandlerRequest 里判断是否合适,如果没达到条件则向下传递,向谁传递之前 set 进去。
注意事项:在 JAVA WEB 中遇到很多应用。
基本介绍
职责链模式的原理类图

对原理类图的说明-即(职责链模式的角色及职责)
比如说 区长遇到一件事,他解决不了,他会上报给市长,市长解决不了,又会上报给省长,这样一步一步的。这就是责任链。
学校 OA 系统的采购审批项目:需求是
采购员采购教学器材
请设计程序完成采购审批项目
传统的设计方案(类图)

传统方案解决 OA 系统审批问题分析

代码实现
package com.atguigu.responsibilitychain;
public abstract class Approver {
    Approver approver;  //下一个处理者 
    String name; // 名 字
    public Approver(String name) {
        this.name = name;
    }
    //下一个处理者
    public void setApprover(Approver approver) { 
        this.approver = approver;
    }
    //处理审批请求的方法,得到一个请求, 处理是子类完成,因此该方法做成抽象
    public abstract void processRequest(PurchaseRequest purchaseRequest);
}
package com.atguigu.responsibilitychain;
//请求类
public class PurchaseRequest {
    private int type = 0; //请求类型
    private float price = 0.0f; //请求金额
    private int id = 0;
    //构造器
    public PurchaseRequest(int type, float price, int id) { 
        this.type = type;
        this.price = price;
        this.id = id;
    }
    public int getType() { 
        return type;
    }
    public float getPrice() { 
        return price;
    }
    public int getId() { 
        return id;
    }
}
package com.atguigu.responsibilitychain;
public class DepartmentApprover extends Approver {
    public DepartmentApprover(String name) {
        super(name);
    }
    @Override
    public void processRequest(PurchaseRequest purchaseRequest) {
        if(purchaseRequest.getPrice() <= 5000) {
            System.out.println(" 请求编号 id= " + purchaseRequest.getId() + " 被 " + this.name + " 处理");
        }else {
            approver.processRequest(purchaseRequest);
        }
    }
}
package com.atguigu.responsibilitychain;
public class CollegeApprover extends Approver {
    public CollegeApprover(String name) {
        super(name);
    }
    @Override
    public void processRequest(PurchaseRequest purchaseRequest) {
        if(purchaseRequest.getPrice() < 5000 && purchaseRequest.getPrice() <= 10000) {
            System.out.println(" 请求编号 id= " + purchaseRequest.getId() + " 被 " + this.name + " 处理");
        } else {
            approver.processRequest(purchaseRequest);
        }
    }
}
package com.atguigu.responsibilitychain;
public class ViceSchoolMasterApprover extends Approver {
    public ViceSchoolMasterApprover(String name) {
        super(name);
    }
    @Override
    public void processRequest(PurchaseRequest purchaseRequest) {
        if(purchaseRequest.getPrice() < 10000 && purchaseRequest.getPrice() <= 30000) {
            System.out.println(" 请求编号 id= " + purchaseRequest.getId() + " 被 " + this.name + " 处理");
        }else {
            approver.processRequest(purchaseRequest);
        }
    }
}
package com.atguigu.responsibilitychain;
public class SchoolMasterApprover extends Approver {
    public SchoolMasterApprover(String name) {
        super(name);
    }
    @Override
    public void processRequest(PurchaseRequest purchaseRequest) {
        if(purchaseRequest.getPrice() > 30000) {
            System.out.println(" 请求编号 id= " + purchaseRequest.getId() + " 被 " + this.name + " 处理");
        } else {
            approver.processRequest(purchaseRequest);
        }
    }
}
package com.atguigu.responsibilitychain;
public class Client {
    public static void main(String[] args) {
        //创建一个请求
        PurchaseRequest purchaseRequest = new PurchaseRequest(1, 31000, 1);
        //创建相关的审批人
        DepartmentApprover departmentApprover = new DepartmentApprover("张主任"); 
        CollegeApprover collegeApprover = new CollegeApprover("李院长");
        ViceSchoolMasterApprover viceSchoolMasterApprover = new ViceSchoolMasterApprover("王副校"); 
        SchoolMasterApprover schoolMasterApprover = new SchoolMasterApprover("佟校长");
        //需要将各个审批级别的下一个设置好 (处理人构成环形: ) 
        departmentApprover.setApprover(collegeApprover); 
        collegeApprover.setApprover(viceSchoolMasterApprover); 
        viceSchoolMasterApprover.setApprover(schoolMasterApprover); 
        schoolMasterApprover.setApprover(departmentApprover);
        departmentApprover.processRequest(purchaseRequest); 
        viceSchoolMasterApprover.processRequest(purchaseRequest);
    }
}

package com.atguigu.spring.test;
import org.springframework.web.servlet.HandlerExecutionChain; 
import org.springframework.web.servlet.HandlerInterceptor;
public class ResponsibilityChain {
    public static void main(String[] args) {
        // DispatcherServlet
        //说明
        /*
        *
        * protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
        *   HandlerExecutionChain mappedHandler = null;
        *   mappedHandler = getHandler(processedRequest);//获取到 HandlerExecutionChain 对象
        *   //在 mappedHandler.applyPreHandle 内部 得到啦 HandlerInterceptor interceptor
        *   //调用了拦截器的  interceptor.preHandle
        *   if (!mappedHandler.applyPreHandle(processedRequest, response)) { 
        *       return;
        *   }
        *
        *   //说明:mappedHandler.applyPostHandle 方法内部获取到拦截器,并调用
        *   //拦截器的  interceptor.postHandle(request, response, this.handler, mv);
        *   mappedHandler.applyPostHandle(processedRequest, response, mv);
        * }
        *
        *
        * //说明:在 mappedHandler.applyPreHandle 内部中,
        * 还调用了 triggerAfterCompletion 方法,该方法中调用了
        * HandlerInterceptor interceptor = getInterceptors()[i]; 
        * try {
        *   interceptor.afterCompletion(request, response, this.handler, ex);
        * }
        * catch (Throwable ex2) {
        *   logger.error("HandlerInterceptor.afterCompletion threw exception", ex2);
        * }
        */
    }
}
原文:https://www.cnblogs.com/blknemo/p/13260000.html