1. 责任链模式介绍
使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。
考虑到如下情景:
小李要出差,出差之后,小李要报销经费,小李申请了50000块的经费。
首先向组长提出,组长,他只能报销2000元以内的。组长把小李的请求向主管提出。
主管收到申请后,主管说他也无法批准,他只能批准5000以内的,所以主管把请求又递交给了总经理。
总经理收到请求后,他只能批准10000以内的,所以主管把请求又递交给了老板。
老板收到请求后,把小李的请求给处理了。
以上请求就是一个责任链模式,发出请求者并不知道谁会来处理请求,每个领导会根据自己的职责范围,来判断是处理还是把请求递交给更高级别的领导。只要有领导处理了,传递就结束了。
2. 责任链模式使用场景
- 多个对象可以处理同一请求,单具体由哪个对象处理则在运行时动态决定的。
- 在请求矗立着不明确的情况下向多个对象中的一个提交一个请求。
- 需要动态指定一组对象处理请求。
3. 责任链模式UML类图
4. 责任链模式简单实现
情景描述:介绍里面描述的申请经费案例。
包结构:
(1) 首先声明一个抽象的老板类:
public abstract class Leader {
protected Leader nextHandler;//上一级领导处理者
public void handleRequest(int money) {
if (money <= limit()) {
handleMoney(money);
} else {
if (nextHandler != null) {
nextHandler.handleRequest(money);
}
}
}
//处理
protected abstract void handleMoney(int money);
//每一级领导能够批准的额度
protected abstract int limit();
}
在上述抽象类中,发起请求时,调用handleRequest()方法,步骤如下:
在handleRequest方法中,首先判断传递进来的money是否小于当前领导能够批准的额度。这个额度由 limit()这个方法返回,limit()是一个抽象方法,由具体的领导实现。
如果money小于当前领导所能处理的额度,调用handleMoney(money)方法,handleMOney(money)也是一个抽喜类,由具体的领导类实现。
如果money大于当前领导所能处理的额度,调用上一级领导的handleReqeust()方法。
重复以上1、2、3步骤,直到结束。
(2)具体的领导类:Boos,DirectorLeader,GroupLeader,ManagerLeader:
public class Boss extends Leader {
@Override
protected void handleMoney(int money) {
System.out.println("老板报销: " + money);
}
@Override
protected int limit() {
return Integer.MAX_VALUE;
}
}
(3)测试类:
public class Person {
public static void main(String[] args) {
//构造各个级别领导
GroupLeader groupLeader = new GroupLeader();
DirectorLeader directorLeader = new DirectorLeader();
ManagerLeader managerLeader = new ManagerLeader();
Boss boss = new Boss();
//设置上一级领导处理对象
groupLeader.nextHandler = directorLeader;
directorLeader.nextHandler = managerLeader;
managerLeader.nextHandler = boss;
//申请报销
groupLeader.handleRequest(50000);
}
}
- 对于责任链来说,一个请求最终只有两种情况:一是被某个处理对象处理,另一个是所有的对象均为对其处理。 对于前一种情况,我们称该对象为纯的责任链,对于后一种情况我们称为不纯的责任链,在实际应用中,我们所见的责任链模式大多为不纯的责任链模式。
5. 责任链模式在Android系统中
android触摸事件流程是一个典型的责任链模式,具体网上有很多优质的文章介绍,这里就不做赘述了。
这里推荐一篇个人决定不错的文章。
6. 责任链模式在Android开发中
责任链模式可以替代各种分支和条件判断语句,这里就不做具体举例。
7. 总结
- 优点:
- 可以对请求者和处理者关系解耦,提高代码的灵活性。
- 缺点:
- 对链中请求处理的遍历,如果处理者太多,那么遍历必定会影响性能。