设计模式之责任链模式

责任链模式

什么是责任链?

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

责任链常见于一些审批流程中,流程的节点往往是不同岗位的责任人。常见的框架中也多有设计,比如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框架请求数据的校验和过滤,工作流审批业务等。

相关推荐
Tiny_React4 小时前
智能体设计模式-附录 C - 智能体框架快速概览
设计模式
沐怡旸4 小时前
【穿越Effective C++】条款02:尽量以const, enum, inline替换#define
c++·面试
CptW4 小时前
第1篇(Ref):搞定 Vue3 Reactivity 响应式源码
前端·面试
渣哥6 小时前
你以为 Bean 只是 new 出来?Spring BeanFactory 背后的秘密让人惊讶
javascript·后端·面试
YBN娜6 小时前
设计模式-创建型设计模式
java·开发语言·设计模式
地方地方7 小时前
Vue依赖注入:provide/inject 问题解析与最佳实践
前端·javascript·面试
在未来等你7 小时前
Elasticsearch面试精讲 Day 26:集群部署与配置最佳实践
大数据·分布式·elasticsearch·搜索引擎·面试
渣哥7 小时前
原文来自于:[https://zha-ge.cn/java/128](https://zha-ge.cn/java/128)
javascript·后端·面试
渣哥7 小时前
项目写得再多也没用!Spring Bean 的核心概念要是没懂,迟早踩坑
javascript·后端·面试
YuanlongWang7 小时前
C# 设计模式——单例模式
单例模式·设计模式·c#