美文网首页
设计模式之职责链模式

设计模式之职责链模式

作者: kwbsky | 来源:发表于2019-12-12 11:51 被阅读0次
    定义

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

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

    相关文章

      网友评论

          本文标题:设计模式之职责链模式

          本文链接:https://www.haomeiwen.com/subject/gclagctx.html