责任链模式可以根据字面意思理解,就是一个任务,需要经过很多个节点共同完成,现实中常见的有请假,我们在OA上提交了一个请假流程,首先得你的上级领导审批通过,然后部门经理,然后人事部门审批,最终你的请假流程就完成了。还有像gateway中的filter,请求都是需要经过这些filter的逻辑校验,通过才往下走,这些都是责任链模式的运用,那么我们如何通过代码案例来体现责任链模式呢?
我计划使用责任链模式来模拟一下请假的流程,请假一共分三个审批,上级领导、部门经理、HR审批。代码示例如下
审批父类
public abstract class Approval {
//用来指向下一个审批节点
protected Approval next;
/**
* 保存下一个节点,便于链式调用
* @param next
* @return
*/
public Approval connect(Approval next) {
this.next = next;
return next;
}
public void leave() {
boolean flag = this.doLeave();
if (flag) {
Optional.ofNullable(next).ifPresent(Approval::leave);
}
}
public abstract boolean doLeave();
}
上级领导审批类
public class LeaderApproval extends Approval {
@Override
public boolean doLeave() {
System.out.println("主管审批通过");
return true;
}
}
部门经理审批类
public class ManagerApproval extends Approval {
@Override
public boolean doLeave() {
System.out.println("经理审批通过");
return true;
}
}
HR部门审批类
public class HRApproval extends Approval {
@Override
public boolean doLeave() {
System.out.println("人事审批通过");
return true;
}
}
测试代码
public class Main {
public static void main(String[] args) {
Approval approval = new LeaderApproval();
approval.connect(new ManagerApproval()).connect(new HRApproval());
approval.leave();
}
}
演示效果
以上是责任链模式的演示代码,这种模式适合那种前面节点对后面节点有影响的场景,实际工作中可以想到的是工作流。工作流的流程可以联想到责任链模式。还有就是security的获取用户信息的流程有这种设计模式的运用,其他的没想到了。