职责链模式

Author Avatar
丁起男 07月 05,2021
  • 在其它设备中阅读本文章

职责链模式

需求

采购审批

  • 采购员采购教学器材
  • 如果金额小于5000,由教学主任审批
  • 如果金额小于10000,由院长审批
  • 如果金额小于30000,由副校长审批
  • 如果金额超过30000,由校长审批

基本介绍

  • 职责链模式又叫责任链模式,为请求创建了一个接收者对象的链。这种模式对请求的发送者和接收者进行解耦
  • 职责链模式通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传递给下一个接收者,以此类推
  • 这种类型的设计模式属于行为型模式

责任链模式使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连城一条链,并沿着这条链传递该请求,直到有一个对象处理为止

代码

请求对象

@Data
public class PurchseRequest{
    //金额
	private int price;
    
    public PurchseRequest(int price){
        this.price = price
    }
}

处理者抽象

public abstract class Approver{
    //下一个处理者
    private Approver approver;
    
    public Approver(Approver approver){
        Approver approver = approver;
    }
    //处理请求的方法
    public abstract void processRequest(PurchseRequest purchseRequest);
}

处理者实现

//系主任
public class DepartmentApprover extends Approver{
    
    public DepartmentApprover(Approver approver){
        super(approver);
    }
    
    @Override
    public void processRequest(PurchseRequest purchseRequest){
        if(purchseRequest.getPrice()<5000){
            System.out.println("系主任审批");
        }else{
            approver.processRequest(purchseRequest);
        }
    }
}
//院长
public class CollegeApprover extends Approver{
    
    public CollegeApprover(Approver approver){
        super(approver);
    }
    
    @Override
    public void processRequest(PurchseRequest purchseRequest){
        if(purchseRequest.getPrice()<10000){
            System.out.println("院长审批");
        }else{
            approver.processRequest(purchseRequest);
        }
    }
}
//副校长
public class ViceSchoolMasterApprover extends Approver{
    
    public ViceSchoolMasterApprover(Approver approver){
        super(approver);
    }
    
    @Override
    public void processRequest(PurchseRequest purchseRequest){
        if(purchseRequest.getPrice()<30000){
            System.out.println("副校长审批");
        }else{
            approver.processRequest(purchseRequest);
        }
    }
}
//校长
public class SchoolMasterApprover extends Approver{
    
    public SchoolMasterApprover(Approver approver){
        super(approver);
    }
    
    @Override
    public void processRequest(PurchseRequest purchseRequest){
        System.out.println("校长审批");
    }
}

测试

//创建请求
PurchseRequest purchseRequest = new PurchseRequest(27000);
//审批链
Approver approver = new DepartmentApprover(new CollegeApprover(new ViceSchoolMasterApprover(SchoolMasterApprover(null))));
//处理请求
approver.processRequest(purchseRequest);

总结

  • 将请求和处理分开,实现解耦,提高系统的灵活性
  • 简化了对象,使对象不需要知道链的结构
  • 性能会受到影响,特别是在链比较长的时候,因此需要控制链中最大节点数量
  • 调试不方便。采用了类似传递的方式,调试时逻辑可能比较复杂
  • 最佳应用场景:有多个对象可以处理同一请求时,比如:多级请求、请假/加薪等审批流程、java web中tomcat对encoding的处理、拦截器