国外著名网站建设公司,天猫店铺入驻流程,镇江市精神文明建设网站,朝阳专业网站建设公司说明#xff1a;本文介绍设计模式中行为型设计模式中的#xff0c;责任链模式#xff1b;
审批流程
责任链模式属于行为型设计模式#xff0c;关注于对象的行为。责任链模式非常典型的案例#xff0c;就是审批流程的实现。如一个报销单的审批流程#xff0c;根据报销单…说明本文介绍设计模式中行为型设计模式中的责任链模式
审批流程
责任链模式属于行为型设计模式关注于对象的行为。责任链模式非常典型的案例就是审批流程的实现。如一个报销单的审批流程根据报销单金额大小需要不同的职位领导审批金额越大审批人的职务越高如下 代码如下
Staff财务专员审批金额不超过5000
/*** 财务专员*/
public class Staff {private String name;public Staff(String name) {this.name name;}/*** 审批* param amount 金额* return 是否通过*/public boolean approve(double amount) {if (amount 5000) {System.out.println(name 审批通过);return true;} else {System.out.println(驳回申请。【 name 】);return false;}}public String getName() {return name;}
}Manager财务经理审批金额不超过1w
/*** 财务经理*/
public class Manager {private String name;public Manager(String name) {this.name name;}/*** 审批* param amount 金额* return 是否通过*/public boolean approve(double amount) {if (amount 10000) {System.out.println(name 审批通过);return true;} else {System.out.println(驳回申请。【 name 】);return false;}}public String getName() {return name;}
}CFO财务总监审批金额不超过10w否则直接找Boss
/*** 财务总监*/
public class CFO {private String name;public CFO(String name) {this.name name;}/*** 审批* param amount 金额* return 是否通过*/public boolean approve(double amount) {if (amount 100000) {System.out.println(name 审批通过);return true;} else {System.out.println(驳回申请。【 name 】);return false;}}public String getName() {return name;}
}Client客户端审批金额5000
/*** 客户端*/
public class Client {public static void main(String[] args) {int amount 8000;Staff staff new Staff(财务专员);Manager manager new Manager(财务经理);CFO cfo new CFO(财务总监);if (!staff.approve(amount)) {if (!manager.approve(amount)) {if (!cfo.approve(amount)) {System.out.println(找Boss);}}}}
}在财务经理这里审批通过 通过上面的代码实现可以看到客户端有多层的if判断代码臃肿不够灵活。
我们可以考虑将审批报销流程的各层人员抽象出来成一个审批人然后再在该类中再注入一个审批人为上级审批人。另外创建一个抽象的审批方法让其他审核人职务继承这个审批人类实现其审批方法。方法内判断当前审批金额该审核人职务不能审核其金额时交给上级审批人审核。
如下
Approver审批人抽象类有审批人、下一个审批人抽象审批方法
/*** 审批人*/
public abstract class Approver {/*** 审批人姓名*/protected String name;/*** 下一个审批人*/protected Approver nextApprover;public Approver(String name) {this.name name;}/*** 设置下一个审批人* param nextApprover* return*/public Approver setNextApprover(Approver nextApprover) {this.nextApprover nextApprover;return this.nextApprover;}/*** 审批* param amount*/public abstract void approve(int amount);
}Staff财务专员审批金额不大于5000否则交给下一位审批人审批
/*** 财务专员*/
public class Staff extends Approver{public Staff(String name) {super(name);}Overridepublic void approve(int amount) {if (amount 5000) {System.out.println(审批通过。【 name 】);} else {System.out.println(金额太大无法审批交由上级处理。【 name 】);this.nextApprover.approve(amount);}}
}Manager财务经理审批金额不大于1w否则交给下一位审批人审批
/*** 财务经理*/
public class Manager extends Approver{public Manager(String name) {super(name);}Overridepublic void approve(int amount) {if (amount 10000) {System.out.println(审批通过。【 name 】);} else {System.out.println(金额太大无法审批交由上级处理。【 name 】);this.nextApprover.approve(amount);}}
}CFO财务总监审批金额不大于10w否则找老板处理
/*** 财务总监*/
public class CFO extends Approver{public CFO(String name) {super(name);}Overridepublic void approve(int amount) {if (amount 100000) {System.out.println(审批通过。【 name 】);} else {System.out.println(金额太大无法审批请找老板处理。【 name 】);}}
}Client客户端
/*** 客户端*/
public class Client {public static void main(String[] args) {// 审批金额int amount 200000;// 审批人Staff staff new Staff(财务专员);Manager manager new Manager(财务经理);CFO cfo new CFO(财务总监);// 设置下一个审批人manager.setNextApprover(cfo);staff.setNextApprover(manager);// 审批staff.approve(amount);}
}执行结果因为审批金额为20w需要找老板处理 或者使用链式编程直接用一行代码搞定
/*** 客户端*/
public class Client {public static void main(String[] args) {// 审批金额int amount 200000;new Staff(财务专员).setNextApprover(new Manager(财务经理)).setNextApprover(new CFO(财务总监)).approve(amount);}
}区别就在于使用链式编程只会执行对应审批人内的if代码块 以上是责任链模式的内容责任链模式是很容易理解的设计模式和我们日常生活非常紧密。但代码却不容易理解在审批人对象里面再注入一个审批人对象不容易想明白。
总结
本文参考《设计模式的艺术》、《秒懂设计模式》两书