责任链模式:当一个请求有多个处理对象,且这多个对象根据某种关系可以组成一条链路,当请求发生时,将请求沿着这条链路传递,直到符合条件的对象将其处理掉。
责任链模式最直观的例子就是我们公司的审批流程,在一个公司中会有各种各样的审批流程,请假,报销,费用支出,立项等等。审批往往并不是一个人就能决定的,通常是多级审批,每个层级有各自的审批范围,那么这个审批层级就形成了一个责任链。当有要审批的事项发生时,沿着对应的责任链依次找到对应的审批人进行处理。
我们以费用支出审批流程为例说明一下:小张接到领导任务,组织下周末的团建,当然就免不了产生一些费用,申请经费需要向领导审批,小张的直属组长只能审批1000元以内的开支,组长再上一级是部门主管,可以审批5000元以内的开支,在上一级就是经理,可以审批10000元以内的开支,超出这个范围不予报销。
现在用责任链模式来实现以下:这里简单点儿,我们可以只涉及一种角色,责任链上的不同审批着都是同样的角色,特殊的地方在于,每一个审批者对象内都包含一个自身类对象的引用,指向它下一级的审批者。
抽象的审批者:
public interface Approve {
// 设置下一级审批者
void setNext(Approve next);
// 处理审批流程
void handle(int cost);
}
三个具体的审批者:
public class GroupLeader implements Approve{
// 下级审批者
private Approve next;
@Override
public void setNext(Approve next) {
this.next = next;
}
@Override
public void handle(int cost) {
if(cost<1000){
System.out.println("小组长审批:同意");
}else {
System.out.println("费用过大,超过组长权限,进入下一级审批");
next.handle(cost);
}
}
}
public class Change implements Approve{
// 下级审批者
private Approve next;
@Override
public void setNext(Approve next) {
this.next = next;
}
@Override
public void handle(int cost) {
if(cost < 5000){
System.out.println("主管审批:同意");
}else {
System.out.println("费用超过了主管的权限范围,进入下一级审批");
next.handle(cost);
}
}
}
public class Manager implements Approve{
// 经理没有审批者
@Override
public void setNext(Approve next) {
}
@Override
public void handle(int cost) {
if(cost < 10000){
System.out.println("经理审批:同意");
}else {
System.out.println("费用太高了,换个方案吧");
}
}
}
测试:
public class Client {
public static void main(String[] args) {
// 创建所有的审批者
GroupLeader groupLeader = new GroupLeader();
Change change = new Change();
Manager manager = new Manager();
// 构建责任链
groupLeader.setNext(change);
change.setNext(manager);
// 测试
groupLeader.handle(600);
groupLeader.handle(3800);
groupLeader.handle(7600);
}
}
小结一下:从这个例子我们可以看出责任链模式的关键点其实就在于每一个责任中包含了下一级责任者,但是这样做是有问题的,当责任者有很多并且关系复杂的时候,维护他们之间的关系是一个需要特别注意的点,比如责任链不能构成环。同时,最后一级需要有一个兜底的操作,因为不一定所有的请求都能满足被处理的条件。另外,框架中的过滤器拦截器有些就是通过这种思想设计的。