设计模式之责任链模式
责任链模式
什么是责任链?
一个请求沿着一条链路执行下去,链路上面的每个节点都可以对请求进行处理。
责任链常见于一些审批流程中,流程的节点往往是不同岗位的责任人。常见的框架中也多有设计,比如springGetaway的网关校验,拦截器等都有责任链的身影。
用责任链有啥好处?
责任链模式有效的将请求者和处理者进行了切割,将多个处理者对象串联形成链路,每个处理者都被允许访问请求者,处理者可以选择处理或者略过,或者新增或者减少处理者。
责任链模式结构图
demo示例
需求:申请人进行融资申请,上传融资信息,如果金额小于10000需要业务员审批即可;如果金额大于10000且小于100000需要部门经理审批,如果金额大于100000需要风控审核员审批.
//申请信息
@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框架请求数据的校验和过滤,工作流审批业务等。
转载自:https://juejin.cn/post/7349002962869256192