责任链模式(Chain of Responsibility Pattern)

来源:互联网 发布:建军大业影评 知乎 编辑:程序博客网 时间:2024/05/22 02:26

责任链模式(Chain of Responsibility Pattern)

概述

责任链模式是行为模式。链是一系列节点的集合,链的节点可以任意拆分重组。将每个节点看做一个对象,每个对象都有不同的处理逻辑,将一个请求从链的头节点出发,沿着链的路径依次传递给每一个节点对象,直至有对象可以处理这个请求为止。

类图

Iterator

角色

  • 抽象对象(Handler),声明一个请求处理的方法,并保持一个继承者(即下一个处理节点)的引用,请求处理方法的核心思想是,如果满足处理的条件,则由本类来解决,否则交给继承者即下一个处理节点来处理。
  • 具体的对象(ConcreteHandler),实现处理的适用条件(用于判断是本类处理还是下一个节点处理)以及具体的处理逻辑

代码

//Handler.javapublic abstract class Handler {    private Handler mSuccessor;    public Handler getSuccessor() {        return mSuccessor;    }    public void setSuccessor(Handler handler) {        this.mSuccessor = handler;    }    public void dispatch(String request) {        if (mSuccessor!= null) {            mSuccessor.handle(request);        }    }    public abstract void handle(String request);}
//ConcreteHandler1.javapublic class ConcreteHandler1 extends Handler {    @Override    public void handle(String request) {        if (request.equals(“c1”)) {            return;        } else {            dispatch(request);        }    }}
//ConcreteHandler2.javapublic class ConcreteHandler2 extends Handler {    @Override    public void handle(String request) {        if (request.equals(“c2”)) {            return;        } else {            dispatch(request);        }    }}
//Client.javapublic class Client {    public static void main(String[] args) {        Handler c1 = new ConcreteHandler1();        Handler c2 = new ConcreteHandler2();        c1.setSuccessor(c2);//设置c1的下一个节点为c2        c1.handle(“c2”);//从c1开始传入请求处理的字符串    }}

优缺点

缺点:

大部分情况下,每条处理请求需要遍历完整个责任链,如果处理节点过多,必然会影响性能

优点:

允许动态的增加或删除处理节点
增加新的处理请求非常方便

使用场景

  1. 字符串处理,如一个字符串需要做多个处理,如去掉非法字符,和谐掉部分词汇,则可以在责任链中处理。
  2. 有多个对象可以处理同一个请求,但是具体由哪个来处理在运行期决定。

总结

责任链模式更像一个更加灵活的if/else语句,可以很方便的设置节点顺序,但是这也有风险,设计者必须很清楚前后类的条件判断关系,避免出现循环引用的情况。

Android源码设计模式

Android按键分发
平台Android6.0
在Android框架层代码中的责任链模式最经典的莫过于按键的分发(以键盘消息KeyEvent为例)。ViewRootImpl在setView函数会构建上面的责任链,按键从native层分发到WindowInputEventReceiver的onInputEvent中,onInputEvent—>enqueueInputEvent—>doProcessInputEvent—>deliverInputEvent—>NativePreImeInputStage::deliver函数进入责任链进行按键处理。

参考
Android源码设计模式解析与实战
http://blog.csdn.net/zhengzhb/article/details/7568676

阅读全文
0 0