设计模式之职责链模式

2019-12-12  本文已影响0人  kwbsky
定义

职责链模式(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方法把处理传递下去。

职责链模式把不同的处理逻辑封装到不同的类中,并把是否处理的逻辑也分发到具体类中。特别需要注意,他是按照既定的顺序执行下来的,所以特别适合需要按照顺序通过判断进行处理的情况。

上一篇下一篇

猜你喜欢

热点阅读