责任链模式的简单实现

来源:互联网 发布:找工作软件软件排行榜 编辑:程序博客网 时间:2024/05/23 01:12

小A出差一趟花费近5万元,回来上班第一天就向组长申请报销费用,组长一看是笔不小的数目,他没有权限审批,于是组长就拿着票据去找部门主管,主管一看要报这么多钱,自己权限内只能批五千以下的费用,这完全超出了自己的权限范围.于是主管又跑去找经理,经理一看二话不说直接拿着票据奔向了老板的办公室,因为他也只能一万以下的费用。类似的情况对上班族来说肯定并不少见,上面的这个情景其实就是一个责任链的小例子,每一个人,准确地说是每一类人代表这条链上的一个节点,小民是请求的发起者,而老板则是处于链条顶端的类,小A从链的底端开始发出一个申请报账的请求,首先由组长处理该请求,组长比对后发现自己权限不够于是将该请求转发给位经理,而经理又基于同样的原因将请求转发给老板,,这样层层转达直至请求被处理,从中大家可以看到一个显而易见的事,就是至始至终小A只与组长产生关联,后面由谁处理票据,小A并不关心,唯一在乎的是报账的结果,责任链模式在这里很好的将请求的发起者与处理者解耦,。如果我们在代码中模拟这个过程也是很直观的,首先还是先声明一个抽象的领导类。

//抽象领导者
public abstract class Leader {//上一级领导处理者    protected Leader nextHandler;    public final void handleRequest(int money) {        if (money <= limit()) {            handle(money);        } else {            if (null != nextHandler) {                nextHandler.handleRequest(money);            }        }    }    //自己能处理的额度限制    protected abstract int limit();    //处理报账    protected abstract void handle(int money);}

在这个抽象的领导类中只做了两件事,一是定义了两个抽象接口方法来确定一个领导者应有的行为和属性,二是声明了一个处理报账请求的方法来确定当前领导是否有能为处理报账请求。如果没有这权限,则将该请求转发给上级领导处理。接下来则是各个领导类的实现。
//各个具体领导者
public class Groupteader extends Leader {    @Override    protected int limit() {        return 1000;    }    @Override    protected void handle(int money) {        System.out.println("组长处理报销" + money);    }}public class Director extends Leader {    @Override    protected int limit() {        return 5000;    }    @Override    protected void handle(int money) {        System.out.println("主管处理报销" + money);    }}public class Manager extends Leader {    @Override    protected int limit() {        return 10000;    }    @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);    }}
//客户端小A
public class XiaoA {    public static void main(String[] args) {        //构建各领导类        Groupteader groupteader = new Groupteader();        Director director = new Director();        Manager manager = new Manager();        Boss boss = new Boss();        groupteader.nextHandler = director;        director.nextHandler = manager;        manager.nextHandler = boss;        //发起报账请求        groupteader.handleRequest(50000);    }}

这里大家可能会想,可不可以直接越过组长找主管报账呢?答案是肯定的,这也是责任链模式的灵活之处,请求的发起可以从责任链的任何一个节点处开始,同时也可以改变责任链内部传递的规则,如主管不在,我们完全可以跨过主管从组长直接将请求转送给经理。对于责任链中的一个处理者对象,其只有两个行为,一是处理请求,二是将请求转送给下一个节点,不允许某个处理者对象在处理了请求后又将请求转送给上一个节点的情况。对于一条责任链来说,一个请求最终只有两种情况,一是被某个处理对象所处理,另一个是所有对象均未对其处理,对于前一种情况我们称该责任链为纯的责任链,对于后一种情况我们称为不纯的责任链,在实际应用中,我们所见到的责任链模式大多为不纯的责任链。