设计模式之责任链模式

责任链模式

什么是责任链?

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

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

相关推荐
ShineWinsu15 分钟前
对于C++:布隆过滤器(bloomfilter)的详细解析
c++·面试·位图·位运算·布隆过滤器·海量数据·比特位
kyriewen1 小时前
我把 AI 写的并发请求控制器手写了一遍——3 个语义我当时根本讲不清
前端·javascript·面试
程序员贺加贝1 小时前
轻制造SaaS的生产闭环建模-BOM工单领料报工质检与入库
java·设计模式·架构
嘟嘟07173 小时前
SDD 规范驱动开发:从 vibe coding 崩盘到"两次创造"
设计模式·代码规范·vibecoding
进击的明明3 小时前
闭包:JavaScript里的“随身背包” 🎒
前端·javascript·面试
众人皆醒我独醉4 小时前
源码导读:一张地图看懂 KServe 仓库
面试·云计算·gpu
无凭5 小时前
拆解 DeerFlow Memory:Agent 的长期记忆到底怎么做?
人工智能·设计模式
40岁资深老架构师尼恩6 小时前
RAGFlow 数据注入(Ingestion) 通俗解读:数据解析与知识构建 的 大白话介绍
面试
AI大法师8 小时前
品牌焕新不只换 Logo:捷豹案例里的触点重构方法
大数据·人工智能·设计模式·新媒体运营
黄敬峰8 小时前
一文讲透 JWT 登录鉴权:token 的「颁发 → 存储 → 携带 → 校验」完整闭环
面试