定义
责任链模式将责任链内部的业务逻辑与细节隐藏起来,使得客户端可以将责任链视为一个整体并对其发起请求,实现了客户端与责任链内部的响应者的解耦。
工作中,我们的请假审批流程,就和我们的责任链模式逻辑是一样的。审批流程通常按负责人或工作职责进行拆分,并组织好各个环节的流程走向。
如上图所示,请假审批流程需要部门领导、公司领导的审批。
代码实现
部门经理类:员工发起请假流程,第一步是部门经理进行审批,部门经理审批通过后,需要移交公司经理审批
public class DeptManager {
private String name;
public DeptManager(String name) {
this.name = name;
}
public boolean approve() {
System.out.println("部门经理:" + name + "审批通过,移交公司经理");
return true;
}
}
公司经理类:待部门经理审批通过后,需要公司经理审批,公司经理审批通过,该审批流程结束
public class CompanyManager {
private String name;
public CompanyManager(String name) {
this.name = name;
}
public boolean approve() {
System.out.println("公司经理:"+name + "审批通过");
return true;
}
}
客户端
public class Client {
public static void main(String[] args) {
DeptManager deptManager = new DeptManager("张三");
boolean approve = deptManager.approve();
if (approve) {
CompanyManager manager = new CompanyManager("李四");
manager.approve();
}
// 结果
// 部门经理:张三审批通过,移交公司经理
// 公司经理:李四审批通过
}
}
根据上面的实现代码,客户端在发起请假审批的时候,需要先找到部门经理,如果部门经理审批通过了,需要再去找公司经理进行审批。如果我们后期为了优化和完善这个业务流程而添加新的审批角色,客户端就同样需要修改申请逻辑,增加了维护成本。
其实根据客户端发起的审批的流程,我们可以发现,流程之间其实是环环相扣,各个角色在审批之后,需要移交给上级审批,这种传递机制,我们可以将其优化成一个工作流,也就是我们的责任链模式。
优化
将审批角色抽象化,同时引用其上级审批角色。将审批方法抽象化,由其子类去实现
public abstract class Approver {
protected String name;
protected Approver nextApprover;
public Approver(String name) {
this.name = name;
}
public Approver setNextApprover(Approver nextApprover) {
this.nextApprover = nextApprover;
return this.nextApprover;
}
public abstract void approve();
}
优化后的部门经理类
public class DmApprover extends Approver {
public DmApprover(String name) {
super(name);
}
@Override
public void approve() {
System.out.println("部门经理:" + name + "审批通过,移交公司经理");
this.nextApprover.approve();
}
}
优化后的公司经理类
public class CmApprover extends Approver {
public CmApprover(String name) {
super(name);
}
@Override
public void approve() {
System.out.println("公司经理:" + name + "审核通过");
}
}
优化后,客户端在发起审批时,只需要将审批请求交给部门经理,后续的审批流程就会一步一步地进行,简化了客户端的流程
public class Client {
public static void main(String[] args) {
Approver approver = new DmApprover("王五");
approver.setNextApprover(new CmApprover("赵六"));
approver.approve();
// 结果
// 部门经理:王五审批通过,移交公司经理
// 公司经理:赵六审核通过
}
}
以上就是责任链模式的所有内容,我将持续更新设计模式,欢迎大家一起交流😁