Behavioral Design Patterns - xiaoniudonghe2015/Android-Java-Code-Style GitHub Wiki

3.Chain Of Responsibility职责链模式

1.定义

1.1通俗定义

将每一个节点看做一个对象,每一个对象拥有不同的处理逻辑,将一个请求从链式的首端发出,沿着链的路径依次传递给每一个节点对象,直到有对象处理这个请求为止.

1.2标准定义

责任链模式是行为型设计模式的一种,使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止.

2.使用场景

多个对象可以处理同一个请求,但具体由哪个对象处理则在运行时动态决定.

3.简单实现

简单实现

小明出差去X国进修学习新技术,去X国学习一趟花费了5万元,于是小明就向组长申请报销费用,组长一看是笔不小的数目,他没有权限审批,于是组长就拿着票据去找部门主管,主管一看要报这么多钱,自己权限内只能批五千以下的费用,于是主管又跑去找经理,经理一看二话不说直接拿着票据去找老板,因为他只能批一万以下的费用.上述场景就是一个责任链的一小部分,每一个人代表链上的一个节点,小明是请求的发起者,而老板则是链条顶端的类,小明从链的底端开始发出一个申请报账的请求,首先由组长处理该请求,组长发现权限不够将请求转发给位于链中下一个节点的主管,主管对比之后发现自己权限也不够,又将该请求转发给经理,而经理也是基于同样的原因将请求转发给老板,这样层层转达直到请求被处理.自始至终小明只和组长发生了关联,后面具体由谁处理票据小明并不关心,唯一在乎的是报账的结果,责任链模式可以很好的将请求的发起者和处理者解耦.

抽象的领导类

public abstract class Leader {
    protected Leader nextHandler;//上一级领导处理者

    public final void handleRequest(int money) {
        if (money <= limit()) {
            handle(money);
        } else {
            if (nextHandler != null) {
                nextHandler.handleRequest(money);
            }
        }

    }

    /**
     * 自身能批复的额度权限
     *
     * @return 额度
     */
    public abstract int limit();

    /**
     * 处理报账行为
     *
     * @param 具体金额
     */
    public abstract void handle(int money);
}

在这个抽象的领导类中只做两件事,一是定义了两个抽象接口方法来确定一个领导者应用的行为和属性,二是声明了一个处理报账请求的方法来确定当前领导是否有能力处理报账请求,如果没有权限,则将该请求转发给上级领导处理.

接下来是各个领导类的实现:

public class GroupLeader extends Leader {
    @Override
    public int limit() {
        return 1000;
    }

    @Override
    public void handle(int money) {
        System.out.print("组长批复报销" + money + "元");
    }
}

public class DirectorLeader extends Leader {
    @Override
    public int limit() {
        return 5000;
    }

    @Override
    public void handle(int money) {
        System.out.print("主管批复报销" + money + "元");
    }
}

public class Manager extends Leader {
    @Override
    public int limit() {
        return 10000;
    }

    @Override
    public void handle(int money) {
        System.out.print("经理批复报销" + money + "元");
    }
}

public class Boss extends Leader {
    @Override
    public int limit() {
        return Integer.MAX_VALUE;
    }

    @Override
    public void handle(int money) {
        System.out.print("老板批复报销" + money + "元");
    }
}

最后小民开始发起请求申请报账

public class XiaoMin {
    public static void main(String[] args) {
        //构建各个领导对象
        GroupLeader groupLeader = new GroupLeader();
        Director director = new Director();
        Manager manager = new Manager();
        Boss boss = new Boss();
        //设置上一级领导处理对象
        groupLeader.nextHandler = director;
        director.nextHandler = manager;
        manager.nextHandler = boss;

        //发起报账申请
        groupLeader.handleRequest(50000);
    }
}

对于责任链中的一个处理者对象,其只有两个行为,一是处理请求,二是将请求转发给下一个节点,不允许某个处理者对象在处理了请求后又将请求转达给上一个节点.

实现步骤

1.写一个父类,定义各个处理者的限制条件和处理请求的接口,定义一个成员变量指向下一个处理者

2.写各个处理者对象,重写限制条件和处理请求的接口

3.使用的时候,new各个处理者对象,指定各自的下一个处理者对象,最后发起请求