定义
职责链模式(Chain of Responsibility Pattern):避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。职责链模式是一种对象行为型模式。
代码演示
class Requset{
}
class Handler1 implements Handler{
private Handler mHandler;
public Handler1(Handler handler){
this.mHandler = handler;
}
@Override
public void handle(Requset requset) {
if (needHandle){
Log.e(TAG, "handle1");
}else {
mHandler.handle(requset);
}
}
}
class Handler2 implements Handler{
private Handler mHandler;
public Handler2(Handler handler){
this.mHandler = handler;
}
@Override
public void handle(Requset requset) {
if (needHandle){
Log.e(TAG, "handle2");
}else {
mHandler.handle(requset);
}
}
}
class Handler3 implements Handler{
@Override
public void handle(Requset requset) {
Log.e(TAG, "handle3");
}
}
public void handle(){
Handler handler3 = new Handler3();
Handler handler2 = new Handler2(handler3);
Handler handler1 = new Handler1(handler2);
handler1.handle(new Requset());
}
handler1 持有handler2,handler2 又持有handler3。Request是具体处理时需要用到的参数,也可没有。一旦handler1开始处理,那么如果条件允许,就会传递给handler2,再传递给handler3,就像链条一样。相当于把多个处理逻辑分别放到了不同的handler中,将他们解耦。如果需要增加处理逻辑,只需要新建handler的子类。
实际运用
android的事件分发就是典型的职责链模式。每个view都是handler,从顶级view开始传递,内部逻辑判断后如果需要处理就调用onTouchEvent,如果不需要处理就传递下去。
okhttp把http请求的各个步骤分别封装进了不同的拦截器。但是他不是标准的职责链模式,每个拦截器都会去处理。为了把拦截器串起来,他增加了一个类叫chain,chain持有了所有的拦截器和下一个需要执行的拦截器索引,并调用intecept方法把处理传递下去。
职责链模式把不同的处理逻辑封装到不同的类中,并把是否处理的逻辑也分发到具体类中。特别需要注意,他是按照既定的顺序执行下来的,所以特别适合需要按照顺序通过判断进行处理的情况。
网友评论