设计模式之责任链模式

责任链模式

什么是责任链?

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

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

相关推荐
绝无仅有5 小时前
Go 并发同步原语:sync.Mutex、sync.RWMutex 和 sync.Once
后端·面试·github
绝无仅有6 小时前
Go Vendor 和 Go Modules:管理和扩展依赖的最佳实践
后端·面试·github
国家不保护废物6 小时前
10万条数据插入页面:从性能优化到虚拟列表的终极方案
前端·面试·性能优化
lovebugs8 小时前
Kubernetes 实战:Java 应用配置与多环境管理
后端·面试·kubernetes
大米饭消灭者9 小时前
markdown-it是怎么将markdown转为html的
前端·面试
Aeside19 小时前
漫谈代理模式,静态代理到 JDK 和 CGLIB 动态代理
java·设计模式
轻语呢喃10 小时前
async/await:从语法糖到并发优化的异步编程
前端·面试
你我约定有三10 小时前
面试tips--JVM(2)--对象创建的过程
jvm·面试·职场和发展
小凯 ོ10 小时前
实战原型模式案例
java·后端·设计模式·原型模式