69.设计模式笔记-责任链模式

来源:互联网 发布:图片修复软件免费版 编辑:程序博客网 时间:2024/06/06 15:46

转载请注明出处 http://blog.csdn.net/qq_31715429/article/details/78488771
本文出自:猴菇先生的博客

1.定义
将一个请求从链式的首端发出,沿着链的路径依次传递给每一个节点对象,直至有对象处理这个请求为止。使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系。

2.使用场景
多个对象可以处理同一请求,但具体由哪个对象处理则在运行时动态决定。
在请求处理者不明确的情况下向多个对象中的一个提交一个请求。
需要动态指定一组对象处理请求。

3.例子
模仿报销流程,经理、总监、老板,每级领导有限额报销限额,在限额内可以报销,在限额外要交给上级领导处理:

/** * 领导抽象类 */public abstract class Leader{    protected Leader nextHandler;//上一级领导    /**     * 处理报账请求     *     * @param money 请求报销的数量     */    public void handleRequest(int money){        if(limit() < money){            if(nextHandler != null){                nextHandler.handleRequest(money);            }        }else{            handle(money);        }    }    /**     * 自身能批复的额度权限     *     * @return 额度     */    protected abstract int limit();    /**     * 处理报销行为     *     * @param money 具体金额     */    protected abstract void handle(int money);}

各级领导的实现类:

public class Manager extends Leader{    @Override    protected int limit(){        return 5000;    }    @Override    protected void handle(int money){        System.out.println("经理批复了" + money);    }}
public class Director extends Leader{    @Override    protected int limit(){        return 20000;    }    @Override    protected void handle(int money){        System.out.println("总监批复了" + money);    }}
public class Boss extends Leader{    @Override    protected int limit(){        return Integer.MAX_VALUE;    }    @Override    protected void handle(int money){        System.out.println("老板批复了" + money);    }}
public class Test{    public static void main(String[] args){        //各就位        Manager manager = new Manager();        Director director = new Director();        Boss boss = new Boss();        //设置上下级关系        manager.nextHandler = director;        director.nextHandler = boss;        //发起请求        manager.handleRequest(50000);    }}

对于责任链中的一个处理者对象,其只有两个行为,一是处理请求,二是将请求转送给下一个节点,不允许某个处理者对象在处理了请求后又将请求转送给上一个节点的情况。对于一条责任链来说,一个请求最终只有两种情况,一是被某个处理对象所处理,另一个是所有对象均未对其处理,对于前一种情况我们称该责任链为纯的责任链,对于后一种情况我们称为不纯的责任链。

责任链模式在Android源码中比较类似的实现如事件分发和有序广播。

4.总结
优点:可以对请求者和处理者关系解耦,提高代码灵活性。
缺点:对链中请求处理者的遍历,如果处理者太多那么遍历必定会影响性能,特别是在一些递归调用中。

原创粉丝点击