审批流程
责任链模式属于行为型设计模式,关注于对象的行为。责任链模式非常典型的案例,就是审批流程的实现。如一个报销单的审批流程,根据报销单金额大小,需要不同的职位领导审批,金额越大,审批人的职务越高,如下:
/**
* 财务专员
*/
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;
}
}
/**
* 财务经理
*/
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;
}
}
/**
* 客户端
*/
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);
}
@Override
public 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);
}
@Override
public void approve(int amount) {
if (amount <= 10000) {
System.out.println("审批通过。【" + name + "】");
} else {
System.out.println("金额太大,无法审批,交由上级处理。【" + name + "】");
this.nextApprover.approve(amount);
}
}
}
/**
* 财务总监
*/
public class CFO extends Approver{
public CFO(String name) {
super(name);
}
@Override
public 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);
}
}
/**
* 客户端
*/
public class Client {
public static void main(String[] args) {
// 审批金额
int amount = 200000;
new Staff("财务专员").setNextApprover(new Manager("财务经理")).setNextApprover(new CFO("财务总监")).approve(amount);
}
}
以上是责任链模式的内容,责任链模式是很容易理解的设计模式,和我们日常生活非常紧密。但代码却不容易理解,在审批人对象里面再注入一个审批人对象,不容易想明白。
总结
原文地址:https://blog.csdn.net/qq_42108331/article/details/134772958
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_36522.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。