目录
介绍
责任链模式是行为型设计模式之一,链很形象的反映了该模式的结构,比如像我们生活中的锁链,是由一个个节点连接起来的,而且每个节点都可以被工再连接,因此,责任链模式也具有很好的灵活性。我们可以将每个节点看作一个对象,每个对象拥有自己独立的处理逻辑,从链首到链尾依次处理,直到所有节点处理完成为止。
定义
使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系,将这些对象链成一条链,并沿着这条链传递该请求,直到所有对象处理完成为止。
使用场景
多个对象可以处理同一请求,但具体由哪个对象处理则在运行时动态决定。
在请求处理者不明确的情况下向多个对象中的一个提交一个请求。
需要动态指定一组对象处理请求。
代码实现
我们以公司报销为例来实现一下责任链模式,比如我上个月出差,报销费用为100000,先拿给组长审批,组长权限不够,再上交到经理,经理权限是5000,也不够,再上升到老板那里才审批通过,但是后面的审批流程跟发起者已经没关系了,我们不需要关心,只需要按照已定好的流程进行就可以了。将这种行为抽象一下,每一个审批者有三个特点:1、审批者在权限范围内可以审批通过报销;2、每个审批者有一定的金额范围;3、每个审批者知道自己的下一级审批者是谁,根据这些行为,我们抽象审批者如下:
public abstract class Handler {
protected Handler nextHandler;
public void handleRequest(int money) {
if (money <= limit()) {
handle(money);
} else {
nextHandler.handleRequest(money);
}
}
public abstract int limit();
public abstract void handle(int money);
}
然后我们开始从自己发起审批,到达每个审批者,如果权限不够则送到下一级审批者继续审批,代码如下:
public class XiaoMin {
public static void main() {
GroupLeader groupLeader = new GroupLeader();
Manager manager = new Manager();
Boss boss = new Boss();
groupLeader.nextHandler = manager;;
manager.nextHandler = boss;
groupLeader.handleRequest(100000);
}
}
public class GroupLeader extends Handler {
@Override
public int limit() {
return 1000;
}
@Override
public void handle(int money) {
System.out.println("组长同意可以报销: " + money);
}
}
public class Manager extends Handler {
@Override
public int limit() {
return 5000;
}
@Override
public void handle(int money) {
System.out.println("经理同意可以报销: " + money);
}
}
public class Boss extends Handler {
@Override
public int limit() {
return Integer.MAX_VALUE;
}
@Override
public void handle(int money) {
System.out.println("老板同意可以报销: " + money);
}
}
可以看到最后的流程审批发起者已经完全不可见了,这样也就实现了两者的解耦。实际工作中,比如我们的相机要添加各种算法特效,也可以很好的使用责任链模式,假设相机预览现在要加上A、B、C三个算法,或者是动态改变的等等复杂情况,那么我们只需要抽象出来一个决策模块,它的任务就是把需要处理的算法组织成责任链,上下相互衔接起来就好了,而每个算法处理者中都已经赋值好了下一个处理者,这样只需要在入口发起算法特效处理,当责任链处理完,所有的特效都会按照要求添加上去了,当中每个节点的handle方法都可以根据自己的规则进行特殊处理,是不是非常方便??