定义
一个请求沿着一条“链”传递,直到该“链”上的某个处理者处理它为止。
在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。
发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。
责任链模式的要点主要是:
1、有多个对象共同对一个任务进行处理。
2、这些对象使用链式存储结构,形成一个链,每个对象知道自己的下一个对象。
3、一个对象对任务进行处理,可以添加一些操作后将对象传递个下一个任务。也可以在此对象上结束任务的处理,并结束任务。
4、客户端负责组装链式结构,但是客户端不需要关心最终是谁来处理了任务。
角色说明
- Handler(抽象处理者): 抽象类或者接口,定义处理请求的方法以及持有下一个Handler的引用。
- ConcreteHandler(具体处理者) : 实现抽象处理类,对请求进行处理,如果不处理则转发给下一个处理者。
- Client (客户端): 即要使用责任链模式的地方。
代码
1、创建处理器接口
public abstract class Handler {
public Handler successor;//下一级责任链
public void setSuccessor(Handler successor){//设置下一级责任链
this.successor=successor;
}
public abstract void request(int request);
}
2、处理器对象1
public class ConcreteHandler1 extends Handler {
@Override
public void request(int request) {
if(request<10){
System.out.println("我是handler1,我处理了请求:"+request);
}else {
successor.request(request);
}
}
}
3、处理器对象2
public class ConcreteHandler2 extends Handler {
@Override
public void request(int request) {
if(request>10){
System.out.println("我是handler2,我处理了请求:"+request);
}else {
System.out.println("请求"+request+"没人能处理");
}
}
}
4、客户端
public class Client {
public static void main(String[] args) {
Handler handler1=new ConcreteHandler1();
Handler handler2=new ConcreteHandler2();
handler1.setSuccessor(handler2);//核心代码
int[] requests={4,10,59,2,16};
for(int request:requests){//调用处理器处理
handler1.request(request);
}
}
}
5、执行结果
我是handler1,我处理了请求:4
请求10没人能处理
我是handler2,我处理了请求:59
我是handler1,我处理了请求:2
我是handler2,我处理了请求:16
优点
代码的解耦,请求者与处理者的隔离分开。
易于扩展,新增处理者往链上加结点即可。
缺点
责任链过长的话,或者链上的结点判断处理时间太长的话会影响性能,特别是递归循环的时候。
请求有可能遍历完链都得不到处理。
Android中的源码分析
OKhttp 是典型的责任链模式,可以看一下 OKhttp 的实现,很经典。