职责链模式
需求
采购审批
- 采购员采购教学器材
- 如果金额小于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的处理、拦截器