定义
使多个对象有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。
UML类图

- Handler:抽象处理者角色,声明一个请求处理的方法,并且在其中保持一个对下一个处理节点Handler对象的引用。
- ConcreteHander:具体处理者角色,对请求进行处理,如果不能处理就转给下一个节点上的处理对象
简单实现
场景设置:出差回来后,请求报销旅费。
public abstract class Leader {
protected Leader nextLeader;
public final void handerRequest(int money){
if(money <=limit()){
handle(money);
}else {
if(nextLeader!=null){
nextLeader.handerRequest(money);
}
}
}
/**
* 自身能批复的额度
* @return
*/
protected abstract int limit();
public abstract void handle(int money);
}
public class GroupLeader extends Leader {
@Override
protected int limit() {
return 1000;
}
@Override
public void handle(int money) {
System.out.println("组长批复报销:"+money+"元");
}
}
public class Director extends Leader {
@Override
protected int limit() {
return 5000;
}
@Override
public void handle(int money) {
System.out.println("主管批复报销:"+money+"元");
}
}
public class Manager extends Leader {
@Override
protected int limit() {
return 10000;
}
@Override
public void handle(int money) {
System.out.println("经理批复报销:"+money+"元");
}
}
public class Boss extends Leader {
@Override
protected int limit() {
return Integer.MAX_VALUE;
}
@Override
public void handle(int money) {
System.out.println("老板批复报销:"+money+"元");
}
}
“我”先向组长申请报账。
public class Me {
public static void main(String[] args) {
GroupLeader groupLeader=new GroupLeader();
Director director=new Director();
Manager manager=new Manager();
Boss boss=new Boss();
groupLeader.nextLeader=director;
director.nextLeader=manager;
manager.nextLeader=boss;
groupLeader.handerRequest(7000);
}
}
最终程序走到“经理”这边就结束了,不需要打扰老板。那么是不是可以直接越过组长直接找“经理”报账呢? 答案是肯定的,这也责任链模式的灵活之处。
对于一个责任链来说,一个请求最终由两个情况,一是被某个处理对象处理,二是所有对象均未对其处理。在实际应用中,我们所见的责任链大多是第二种情况。
Android源码中的责任链实现
最经典的实现就是事件的分发处理了,这里就不贴代码,请看图:

ViewGroup事件传递的递归调用就类似于一条责任链,一旦寻找到责任者,那么将由责任者持有并消费掉该次事件。具体体现在View的onTouchEvent方法中返回值的设置,如果onTouchEvent返回false,那么意味着当前View不会是该次事件的责任人,将不会对其持有;如果为true则相反,此时View会持有该事件并不再向外传递。
网友评论