定义
使多个对象都有机会处理请求,从而避免了请求发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。
使用场景
- 多个对象都可以处理该请求,具体由哪个对象处理则由运行时动态决定。
- 在请求处理者不明确的情况下,向多个对象中的一个提交一个请求。
- 需要动态指定一组对象处理请求。
实现方式
背景:小敏公派出国进修回来,需要报销5万元的差旅费,于是她便向她的组长提出报销申请。但由于金额过大,组长无权审批,便逐级上报至BOSS。
解决方案:责任链模式
Handler(抽象处理类)
public abstract class Leader {
protected Leader nextHandler; // 下一个处理者
/**
* 处理请求
* @param money 能批复的报账额度
*/
public final void handleRequest(int money) {
if (money < limit()) {
// 报账额度 < 批复限额,直接处理
handle(money);
} else {
// 否则,直接传递到下一个处理者
nextHanlder.handleRequest(money);
}
}
// 设置批复限额
public abstract int limit();
// 具体处理请求事项
public abstract void handle(int money);
}
ConcreteHandler(具体处理类)
组长
public class GroupLeader extends Leader {
@Override
public int limit() {
return 1000;
}
@Override
public void handle(int money) {
System.out.println("经组长审核,金额为" + money + "元的报销申请核准通过");
}
}
主管
public class Director extends Leader {
@Override
public int limit() {
return 5000;
}
@Override
public void handle(int money) {
System.out.println("经主管审核,金额为" + money + "元的报销申请核准通过");
}
}
经理
public class Manager extends Leader {
@Override
public int limit() {
return 10000;
}
@Override
public void handle(int money) {
System.out.println("经经理审核,金额为" + money + "元的报销申请核准通过");
}
}
Boss
public class Boss extends Leader {
@Override
public int limit() {
return Integer.MAX_VALUE;
}
@Override
public void handle(int money) {
System.out.println("经老板审核,金额为" + money + "元的报销申请核准通过");
}
}
Client(客户类小敏)
public class ClientXiaomin {
public static void main(String[] args) {
// 构造各个领导对象
GroupLeader groupLeader = new GroupLeader();
Director director = new Director();
Manager manager = new Manager();
Boss boss = new Boss();
// 设置各领导对象的上一级对象
groupLeader.nextHandler = director;
director.nextHandler = manager;
manager.nextHandler = boss;
// 想组长提交5W报销请求
groupLeader.handleRequest(50000);
}
}
优缺点
优点
- 可以将请求者与处理者解耦,提高代码灵活性
缺点
- 对请求处理者的多次遍历,如果处理者太多,则会影响性能。(在递归调用中,需慎重使用)
注意
Android 源码中的责任链模式,参考 ViewGroup 中的 dispatchTouchEvent(MotionEvent e) 方法(事件分发)。当 onTouchEvent 返回 true 时,则消费了当前事件,不再继续往下传递。如果为 false,则继续传递,类似一条责任链。
而在 Android 中的 有序广播 Ordered Broadcast 和责任链模式很相近,可以通过它实现全局责任链事件处理。
网友评论