设计模式之责任链模式

责任链模式

什么是责任链?

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

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

相关推荐
哈里谢顿8 小时前
如何实现分布式锁
面试
白露与泡影10 小时前
Java面试题库及答案解析(2026版)
java·开发语言·面试
June bug10 小时前
全链路测试
功能测试·面试·职场和发展
AI成长日志12 小时前
【笔面试算法学习专栏】哈希表基础:两数之和与字母异位词分组
学习·算法·面试
qqxhb12 小时前
26|Agent 设计模式:ReAct、Plan-and-Solve 与反射
设计模式·react模式·plan-and-solve·reflection模式
ShineWinsu13 小时前
对于Linux:文件操作以及文件IO的解析
linux·c++·面试·笔试·io·shell·文件操作
hssfscv13 小时前
软件设计师下午题六——Java的各种设计模式
java·算法·设计模式
U盘失踪了13 小时前
面试题:你在测试工作中有使用过AI吗?具体是怎么用的?
面试
Baihai_IDP14 小时前
微软多模态推理模型 Phi-4-reasoning-vision 训练经验分享
人工智能·面试·llm
前端Hardy14 小时前
前端开发效率翻倍:15个超级实用的工具函数,直接复制进项目(建议收藏)
前端·javascript·面试