设计模式之责任链模式

责任链模式

什么是责任链?

一个请求沿着一条链路执行下去,链路上面的每个节点都可以对请求进行处理。

责任链常见于一些审批流程中,流程的节点往往是不同岗位的责任人。常见的框架中也多有设计,比如springGetaway的网关校验,拦截器等都有责任链的身影。

用责任链有啥好处?

责任链模式有效的将请求者和处理者进行了切割,将多个处理者对象串联形成链路,每个处理者都被允许访问请求者,处理者可以选择处理或者略过,或者新增或者减少处理者。

责任链模式结构图

demo示例

需求:申请人进行融资申请,上传融资信息,如果金额小于10000需要业务员审批即可;如果金额大于10000且小于100000需要部门经理审批,如果金额大于100000需要风控审核员审批.

java 复制代码
//申请信息
@Data
public class FinancingRequest {
    private String contractNo; //合同号
    private BigDecimal amount; //融资金额
    private String applyName;//申请人
    private String applyAccount;//申请人账号
}
// 抽象审批父类
public abstract class Handler {
    private Handler next;
    public Handler(Handler next) {
        this.next = next;
    }
    public Handler getNext() {
        return next;
    }
    //审批操作
    public abstract void execute(FinancingRequest request);
   
}
//经理审批
public class ManagerHandler extends Handler{
    public ManagerHandler(Handler next) {
        super(next);
    }
    @Override
    public void execute(FinancingRequest request) {
        // 处理请求者对象
        if(request.getAmount().compareTo(new BigDecimal(100000)) <= 0){
            System.out.println("部门经理放款审批通过");
        }else {
            System.out.println("部门经理无审批权限,审批流转下一节点");
            // 处理完成后交给下一个处理者进行处理
            if (null != this.getNext()){
                this.getNext().execute(request);
            }
        }
    }
}
// 业务员审批
public class SalesmanHandler extends Handler{
    public SalesmanHandler(Handler next) {
        super(next);
    }
    @Override
    public void execute(FinancingRequest request) {
        // 处理请求者对象
        if(request.getAmount().compareTo(new BigDecimal(10000)) <= 0){
            System.out.println("业务员放款申请");
        }else {
            System.out.println("业务员无审批权限,审批流转下一节点");
            // 处理完成后交给下一个处理者进行处理
            if (null != this.getNext()){
                this.getNext().execute(request);
            }
        }

    }
}
// 风控岗审批
public class RiskControlHandler extends Handler{
    public RiskControlHandler(Handler next) {
        super(next);
    }
    @Override
    public void execute(FinancingRequest request) {
            // 处理请求者对象
        if(request.getAmount().compareTo(new BigDecimal(1000000)) <= 0){
            System.out.println("风控审核员放款审批通过");
        }else {
            System.out.println("风控审核员无审批权限,审批流转下一节点");
            // 处理完成后交给下一个处理者进行处理
            if (null != this.getNext()){
                this.getNext().execute(request);
            }
        }
    }
}

//测试模拟
public static void main(String[] args) {
    FinancingRequest request = new FinancingRequest();
    request.setAmount(new BigDecimal("1000000.00"));
    request.setApplyAccount("1268162784");
    request.setApplyName("托尼");
    request.setContractNo("ht_001");
    Handler handler3 = new RiskControlHandler(null);
    Handler handler2 = new ManagerHandler(handler3);
    Handler handler1 = new SalesmanHandler(handler2);
    handler1.execute(request);
}

预期结果如下:

责任链模式总结

责任链模式是通过维护一条责任链,来实现请求者和处理者的分离,责任链适用于web框架请求数据的校验和过滤,工作流审批业务等。

相关推荐
Baihai_IDP1 小时前
为什么 AI 巨头们放弃私有壁垒,争相拥抱 Agent Skills
人工智能·面试·llm
Moment1 小时前
Agent 开发本质上就是高级点的 CRUD
前端·后端·面试
哈里谢顿12 小时前
0305乒乓xx agent运维开发岗面试记录
面试
哈里谢顿12 小时前
0309面试二总结
面试
哈里谢顿12 小时前
0309面试一记录
面试
哈里谢顿12 小时前
0310面试二记录
面试
哈里谢顿13 小时前
0310面试记录一
面试
boooooooom15 小时前
讲清 Proxy + effect + track/trigger 流程
javascript·vue.js·面试
豆苗学前端16 小时前
彻底讲透浏览器缓存机制,吊打面试官
前端·javascript·面试
zone773916 小时前
006:RAG 入门-面试官问你,RAG 为什么要切块?
后端·算法·面试