设计模式-责任链模式

来源:互联网 发布:qq for ubuntu 14.04 编辑:程序博客网 时间:2024/06/16 01:35

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
原创粉丝点击