责任链模式(Chain of Responsibility Pattern)
来源:互联网 发布:建军大业影评 知乎 编辑:程序博客网 时间:2024/05/22 02:26
责任链模式(Chain of Responsibility Pattern)
概述
责任链模式是行为模式。链是一系列节点的集合,链的节点可以任意拆分重组。将每个节点看做一个对象,每个对象都有不同的处理逻辑,将一个请求从链的头节点出发,沿着链的路径依次传递给每一个节点对象,直至有对象可以处理这个请求为止。
类图
角色
- 抽象对象(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开始传入请求处理的字符串 }}
优缺点
缺点:
大部分情况下,每条处理请求需要遍历完整个责任链,如果处理节点过多,必然会影响性能
优点:
允许动态的增加或删除处理节点
增加新的处理请求非常方便
使用场景
- 字符串处理,如一个字符串需要做多个处理,如去掉非法字符,和谐掉部分词汇,则可以在责任链中处理。
- 有多个对象可以处理同一个请求,但是具体由哪个来处理在运行期决定。
总结
责任链模式更像一个更加灵活的if/else语句,可以很方便的设置节点顺序,但是这也有风险,设计者必须很清楚前后类的条件判断关系,避免出现循环引用的情况。
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
- 责任链模式(Chain of Responsibility Pattern)
- 责任链模式(Chain of Responsibility Pattern)
- 责任链模式【CHAIN OF RESPONSIBILITY PATTERN 】
- 责任链模式【Chain of Responsibility Pattern】
- 责任链模式(Chain of Responsibility Pattern)
- 责任链模式(Chain of Responsibility Pattern)
- 责任链模式【Chain of Responsibility Pattern】
- 责任链模式 Chain of Responsibility Pattern
- 责任链模式【Chain of Responsibility Pattern】
- 责任链模式【Chain of Responsibility Pattern】
- 责任链模式--Chain of Responsibility Pattern
- 责任链模式 | Chain of Responsibility Pattern
- 【设计模式】责任链模式(Chain of Responsibility Pattern)
- 责任链模式(Chain Of Responsibility Pattern)
- 责任链模式(Chain of Responsibility Pattern)
- 设计模式 - Chain of Responsibility Pattern(责任链模式)
- 设计模式 - Chain of Responsibility Pattern(责任链模式)
- java与模式 责任链模式 Chain of Responsibility pattern
- Codeforces 812 C Sagheer and Nubian Market
- Linux Ubuntu 快速实现Mycat分片管理
- 【贪心策略】USACO 越野跑
- Elasticsearch 5 Ik+pinyin分词配置详解
- Lintcode——整数排序
- 责任链模式(Chain of Responsibility Pattern)
- eclipse导出项目(war包),部署到tomcat,测试实例
- Ubuntu16.04系统中文件名乱码解决方法
- php含有闭包特殊使用
- Tomcat源码分析-Bootstrap类
- 华为手机适配底部虚拟按键的解决方案
- MySQL MyISAM和InnoDB区别
- Codeforces 812 A Sagheer and Crossroads
- spring代理的类图