设计模式-责任链模式
来源:互联网 发布:qq for ubuntu 14.04 编辑:程序博客网 时间:2024/06/16 07:07
1.责任链模式介绍
责任链模式,是行为型模式之一。我们将多个节点首尾相连所构成的模型称为链。对于链式结构,每个节点都可以被拆开再链接,因此链式结构也具有很好的灵活性。将这样一种结构应用于编程领域,将每一个节点看作是一个对象,每一个对象拥有不同的处理逻辑,将一个请求从链式的首端出发,沿着链的路径依次传递给每一个节点对象,直至有对象处理这个请求为止,我们将这样一种模式称为责任链模式。2.责任链模式的定义
使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。3.责任链模式的使用场景
多个对象可以处理同一请求,但具体由哪一个对象处理则在运行状态决定。在请求处理者不明确的情况下向多个对象中的一个提交一个请求。
需要动态指定一组对象处理请求。
4.责任链模式的UML类图
5.代码实现
在公司规定,请假3天以内由经理审批,请假5天以内由总监审批,请假5天以上由总经理审批。如果我们请假,将请假条交由经理处理。如果我们请假10天,超过了经理的处理权限,经理将假条提交至总监。10天假期又超过了总监的处理权限,总监由交由总经理审批,最终将假期审批下来。
假如有天请假,经理不在,我们又可直接找总监请假,具体代码该如何实现呢?
1.抽象领导者/** * 抽象领导者 * Created by Teaphy * 2016/3/30. */public abstract class Leader {protected Leader nextHandler;/** * 处理请假请求 * @param days 请假天数 */public final void handlerRequest(int days) {if (days < limit()) {handle(days);} else {if (null != nextHandler) {nextHandler.handlerRequest(days);}}}/** * 自身能批复的天数 * @return 具体天数 */public abstract int limit();/** * 处理请假行为 * @param days 具体天数 */public abstract void handle(int days);}2. 具体领导者/** * 具体领导者 - 经理 * Created by Teaphy * 2016/3/30. */public class Manager extends Leader {/** * 自身能批复的天数 * @return 具体天数 */public int limit() {return 3;}/** * 处理请假行为 * @param days 具体天数 */public void handle(int days) {System.out.println("Manager 审批假期" + days + "天");}}/** * 具体领导者 - 总监 * Created by Teaphy * 2016/3/30. */public class Director extends Leader {/** * 自身能批复的天数 * @return 具体天数 */public int limit() {return 5;}/** * 处理请假行为 * @param days 具体天数 */public void handle(int days) {System.out.println("Director 审批假期" + days + "天");}}/** * 具体领导者 - 总经理 * Created by Teaphy * 2016/3/30. */public class Boss extends Leader {/** * 自身能批复的天数 * @return 具体天数 */public int limit() {return Integer.MAX_VALUE;}/** * 处理请假行为 * @param days 具体天数 */public void handle(int days) {System.out.println("Boss 审批假期" + days + "天");}}3.测试类/** * Created by Teaphy * 2016/3/30. */public class TestIteratorPattern {public static void main(String[] args) {Manager mManager = new Manager();Director mDirector = new Director();Boss mBoss = new Boss();// 设置Manager下一个节点mManager.nextHandler = mDirector;// 设置Director下一个节点mDirector.nextHandler = mBoss;/** * 请假10天 */mManager.handlerRequest(10);/** * 请假2天,但经理出差,交由总监审批 */mDirector.handlerRequest(2);}}4.输出结果Boss 审批假期10天Director 审批假期2天
6.总结
责任链模式的优点在于对请求者和处理者关系解耦,提高代码的灵活性。责任链模式的最大缺点是对链中请求处理者的遍历,如果处理者太多,繁琐的遍历,必然会影响性能,尤其是在一些递归调用中。
在要求性能的应用中,慎重使用责任链模式。
参考资料
1.Android源码分析与设计模式
0 0
- 责任链设计模式
- 责任链设计模式
- 设计模式---责任链
- 责任链设计模式
- 设计模式----责任链
- 设计模式-责任链
- 责任链设计模式
- 责任链设计模式
- 设计模式:责任链
- [设计]责任链模式
- 设计模式--责任链
- 责任链设计模式
- 设计模式----责任链模式
- 【设计模式】责任链模式
- 设计模式---责任链模式
- 设计模式:责任链模式
- 设计模式--责任链模式
- 设计模式---责任链模式
- Push
- Android ViewPager使用记录
- iOS开发之plist文件的获取
- 第四周项目三②-猜数字游戏
- 归并排序
- 设计模式-责任链模式
- DES加密---随机获取密匙加密
- 基础算法-桶排序
- Android EditText取消焦点并关闭输入法
- 进程与线程区别
- 【C++】《C++标准程序库》小结第十二章-数值
- 搜索引擎选择
- 算法学习之二分查找
- 最大堆与最小堆的实现