职责链模式
- 业务需求:
OA系统采购审批需求(学校OA系统的采购审批项目):- 采购员采购教学器材
- 如果金额小于5000,由教务主任审批【 0 <= x <= 5000 】
- 如果金额小于10000,由院长审批 【 5000 < x <= 10000 】
- 如果金额小于30000,由副院长审批 【 10000 < x <= 30000 】
- 如果金额超过30000,由校长审批 【 30000 < x 】
请设计程序完成采购审批项目。
- 解决方案:
- 传统方案:
- 方式:接受到一个请求后,根据采购金额来调用对用的审批人完成审批。(使用【if–eles-if-eles】||【switch】进行金额判断)
- 问题分析:客户端这里使用到分支判断来对不同的采购请求处理,这样就存在如下问题:
- 如果各个级别的人员审批金额发生变化,在客户端的也需要变化
- 客户端必须明确的知道有多少个审批级别和访问这样对一个采购请求处理和审批人就存在强耦合关系,不利于代码的扩展和维护
- 解决方案:责任链模式
- 职责链模式(Chain of Responsibility pattern)
- 基本介绍
- 又叫责任链模式
- 为请求创建了一个接收者对象的链。这种模式对请求的发送者和接收者进行解耦。
- 责任链模式通常每个接收者都包含对另一个接收者的引用,如果一个对象不能处理该请求,那么它会把相同的请求传递给下一个接受者,依此类推。
- 原理类图
使多个对象都有机会处理请求,从而避免亲求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理为止。
- Handler :抽象的处理者,定义了一个处理请求的接口,同时包含了另外一个Handler
- ConcreteHandlerA、ConcreteHandlerB是具体的处理者,处理它自己负责的请求,可以访问他的后继者(即下一个处理者),如果可以处理当前请求,则处理,否则就将该请求交给后继者去处理,从而形成一个职责链
- Request:含有很多属性,表示一个请求
- 业务类图
- 代码实现
-
创建请求处理对象(PurchaseRequest.java)
package ltd.huazhongyang.responsibilitychain; /** * 请求类 */ public class PurchaseRequest { /** * 请求类型 */ private int type = 0 ; /** * 请求金额 */ private double price = 0.0 ; /** * 请求编号 */ private int id = 0 ; //构造器 public PurchaseRequest(int type, double price, int id) { this.type = type; this.price = price; this.id = id; } public int getType() { return type; } public double getPrice() { return price; } public int getId() { return id; } }
-
创建审批人抽象类
package ltd.huazhongyang.responsibilitychain; /** * 审批人抽象类 */ public abstract class Approver { /** * 下一个处理者 */ private Approver approver ; /** * 名字 */ String name ; public Approver(String name ){ this.name = name ; } /** * * @param approver 下一个处理者 */ public void setApprover(Approver approver) { this.approver = approver; } /** * * @return 返回下一个处理者 */ public Approver getApprover() { return approver; } /** * 处理审批请求的方法,得到一个请求,处理是子类完成,因此该方法做成抽象 */ public abstract void processRequest(PurchaseRequest purchaseRequest); }
-
创建审批人为主任的类,并继承审批Approver.java抽象类
package ltd.huazhongyang.responsibilitychain; public class DepartmentApprover extends Approver{ public DepartmentApprover(String name) { super(name); } @Override public void processRequest(PurchaseRequest purchaseRequest) { System.out.println("金额为:【"+String.valueOf(purchaseRequest.getPrice())+"】"); if (purchaseRequest.getPrice() < 5000){ System.out.println("请求编号:id = "+purchaseRequest.getId()+" 被 【 "+this.name+" 】处理"); }else { System.out.println("-->"+this.name+":请求无法处理,交给下一级处理请求"); super.getApprover().processRequest(purchaseRequest); } } }
-
创建审批人为院长的类,并继承审批Approver.java抽象类
package ltd.huazhongyang.responsibilitychain; public class CollegeApprover extends Approver{ public CollegeApprover(String name) { super(name); } @Override public void processRequest(PurchaseRequest purchaseRequest) { System.out.println("金额为:【"+String.valueOf(purchaseRequest.getPrice())+"】"); if (5000 <= purchaseRequest.getPrice() && purchaseRequest.getPrice() < 10000){ System.out.println("请求编号:id = "+purchaseRequest.getId()+" 被 【 "+this.name+" 】处理"); }else { System.out.println("-->"+this.name+":请求无法处理,交给下一级处理请求"); super.getApprover().processRequest(purchaseRequest); } } }
-
创建审批人为副校长的类,并继承审批Approver.java抽象类
package ltd.huazhongyang.responsibilitychain; public class ViceSchoolMasterApprover extends Approver{ public ViceSchoolMasterApprover(String name) { super(name); } @Override public void processRequest(PurchaseRequest purchaseRequest) { System.out.println("金额为:【"+String.valueOf(purchaseRequest.getPrice())+"】"); if (10000 <= purchaseRequest.getPrice() && purchaseRequest.getPrice() < 30000){ System.out.println("请求编号:id = "+purchaseRequest.getId()+" 被 【 "+this.name+" 】处理"); }else { System.out.println("-->"+this.name+":请求无法处理,交给下一级处理请求"); super.getApprover().processRequest(purchaseRequest); } } }
-
创建审批人为校长的类,并继承审批Approver.java抽象类
package ltd.huazhongyang.responsibilitychain; public class ViceSchoolMasterApprover extends Approver{ public ViceSchoolMasterApprover(String name) { super(name); } @Override public void processRequest(PurchaseRequest purchaseRequest) { System.out.println("金额为:【"+String.valueOf(purchaseRequest.getPrice())+"】"); if (10000 <= purchaseRequest.getPrice() && purchaseRequest.getPrice() < 30000){ System.out.println("请求编号:id = "+purchaseRequest.getId()+" 被 【 "+this.name+" 】处理"); }else { System.out.println("-->"+this.name+":请求无法处理,交给下一级处理请求"); super.getApprover().processRequest(purchaseRequest); } } }
-
创建启动类
package ltd.huazhongyang.responsibilitychain; public class Client { public static void main(String[] args) { PurchaseRequest purchaseRequest = new PurchaseRequest(1, 21000, 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); schoolMasterApprover.processRequest(purchaseRequest); } }
-
测试结果
-
- 基本介绍
- 传统方案: