网站建设管理存在问题,网站上传不了照片,vi设计包含什么,电话销售做网站推销基本介绍
职责链模式#xff08;Chain of Responsibility Pattern#xff09;为请求创建了一个接收者对象的链。这种模式对请求的发送者和接收者进行解耦。职责链模式 又叫责任链模式#xff0c;通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求。那…基本介绍
职责链模式Chain of Responsibility Pattern为请求创建了一个接收者对象的链。这种模式对请求的发送者和接收者进行解耦。职责链模式 又叫责任链模式通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求。那么它会把相同的请求传给下一个接收者。依次类推。这种类型的设计模式属于行为型模式。
引入需求
采购员采购物品
如果金额小于等于5000由教学主任审批如果金额小于等于10000由院长审批如果金额小于等于30000由副校长审批如果金额超过3000以上由校长审批
思路分析
传统方式接收到一个采购请求后根据采购金额来调用对应的审批人完成审批。 传统方式问题分析 客户端会使用分支判断if else / switch来对不同的采购请求处理。就会产生以下问题
如果各个级别的人员审批金额发生变化在客户端也需要变化。客户端必须明确知道有多少审批级别。不利于代码扩展维护。
职责链模式解决类图 代码如下
public class PurchaseRequest {private int type 0; //请求类型private float price 0.0f; //请求金额private int id 0;//构造器public PurchaseRequest(int type, float price, int id) {this.type type;this.price price;this.id id;}public int getType() {return type;}public float getPrice() {return price;}public int getId() {return id;}
}public abstract class Approver {Approver approver; //下一个处理者String name; // 名字public Approver(String name) {this.name name;}//下一个处理者public void setApprover(Approver approver) {this.approver approver;}//处理审批请求的方法得到一个请求, 处理是子类完成因此该方法做成抽象public abstract void processRequest(PurchaseRequest purchaseRequest);}
public class DepartmentApprover extends Approver {public DepartmentApprover(String name) {// TODO Auto-generated constructor stubsuper(name);}Overridepublic void processRequest(PurchaseRequest purchaseRequest) {// TODO Auto-generated method stubif(purchaseRequest.getPrice() 5000) {System.out.println( 请求编号 id purchaseRequest.getId() 被 this.name 处理);}else {approver.processRequest(purchaseRequest);}}
}
public class CollegeApprover extends Approver {public CollegeApprover(String name) {// TODO Auto-generated constructor stubsuper(name);}Overridepublic void processRequest(PurchaseRequest purchaseRequest) {// TODO Auto-generated method stubif(purchaseRequest.getPrice() 5000 purchaseRequest.getPrice() 10000) {System.out.println( 请求编号 id purchaseRequest.getId() 被 this.name 处理);}else {approver.processRequest(purchaseRequest);}}
}
public class ViceSchoolMasterApprover extends Approver {public ViceSchoolMasterApprover(String name) {// TODO Auto-generated constructor stubsuper(name);}Overridepublic void processRequest(PurchaseRequest purchaseRequest) {// TODO Auto-generated method stubif(purchaseRequest.getPrice() 10000 purchaseRequest.getPrice() 30000) {System.out.println( 请求编号 id purchaseRequest.getId() 被 this.name 处理);}else {approver.processRequest(purchaseRequest);}}
}
public class SchoolMasterApprover extends Approver {public SchoolMasterApprover(String name) {// TODO Auto-generated constructor stubsuper(name);}Overridepublic void processRequest(PurchaseRequest purchaseRequest) {// TODO Auto-generated method stubif(purchaseRequest.getPrice() 30000) {System.out.println( 请求编号 id purchaseRequest.getId() 被 this.name 处理);}else {approver.processRequest(purchaseRequest);}}
}public static void main(String[] args) {// TODO Auto-generated method stub//创建一个请求PurchaseRequest purchaseRequest new PurchaseRequest(1, 100000, 1);//创建相关的审批人DepartmentApprover departmentApprover new DepartmentApprover(张主任);CollegeApprover collegeApprover new CollegeApprover(李院长);ViceSchoolMasterApprover viceSchoolMasterApprover new ViceSchoolMasterApprover(王副校);SchoolMasterApprover schoolMasterApprover new SchoolMasterApprover(佟校长);//需要将各个审批级别的下一个设置好 (处理人构成环形: )departmentApprover.setApprover(collegeApprover);collegeApprover.setApprover(viceSchoolMasterApprover);viceSchoolMasterApprover.setApprover(schoolMasterApprover);schoolMasterApprover.setApprover(departmentApprover);departmentApprover.processRequest(purchaseRequest);}
注意事项和细节
将请求和处理分开实现解耦提高系统的灵活性。简化了对象使对象不需要知道链的结构。性能会收到影响特别是链比较长的时候因此需要控制链中最大节点的数量一般通过Handler中设置一个最大节点数量在setNext()方法中判断是否已经超过与阈值超过则不允许该链建立避免出现超长链无意识的破坏系统性能。调试不方便采用了类似递归的方式调试时逻辑可能比较复杂。
最佳应用场景有多个对象可以处理同一个请求时比如多级请求请假。加薪等审批流程。 java web中Tomcat对Encoding的处理拦截器。