责任链模式的简单实现
来源:互联网 发布:找工作软件软件排行榜 编辑:程序博客网 时间: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); }}
这里大家可能会想,可不可以直接越过组长找主管报账呢?答案是肯定的,这也是责任链模式的灵活之处,请求的发起可以从责任链的任何一个节点处开始,同时也可以改变责任链内部传递的规则,如主管不在,我们完全可以跨过主管从组长直接将请求转送给经理。对于责任链中的一个处理者对象,其只有两个行为,一是处理请求,二是将请求转送给下一个节点,不允许某个处理者对象在处理了请求后又将请求转送给上一个节点的情况。对于一条责任链来说,一个请求最终只有两种情况,一是被某个处理对象所处理,另一个是所有对象均未对其处理,对于前一种情况我们称该责任链为纯的责任链,对于后一种情况我们称为不纯的责任链,在实际应用中,我们所见到的责任链模式大多为不纯的责任链。
阅读全文
0 0
- 责任链模式的简单实现
- 责任链模式的简单使用
- 浅谈简单工作流设计——责任链模式配合策略与命令模式的实现
- mina中责任链模式的实现
- 责任链模式的c++代码实现
- 责任链模式的实现和理解
- 【责任链模式】模拟Struts责任链工作流及简单AOP实现
- 责任链模式-C++实现
- 设计模式---责任链模式(C++实现)
- 设计模式--责任链模式--Java实现
- 责任链设计模式的原理与实现
- 过滤器的基本实现(责任链设计模式)
- 责任链设计模式模拟Java Web过滤器的实现
- 责任链模式的7种不同实现
- 责任链模式实现的三种方式
- Android的责任链模式
- 责任链模式(java语言实现)
- c++设计模式之(状态模式和责任链模式)的实现
- Spring Boot简单环境配置
- 【JAVA学习】——hashmap和hashtable的区别
- python学习笔记(七)——小小的实践
- C语言,输出正方形
- 网卡开开门之从青涩少女到成熟少妇
- 责任链模式的简单实现
- 正则表达式总结
- linux ubuntu下安装nginx及其依赖包
- Python3_购物车
- workbench
- 2017-10-29
- 动态获取滚动条位置,距离页面顶部距离scrollTop,两种方法任你选,封装完毕,拿去不谢!!!
- 小谈H5 web本地数据存储
- centos svn 迁移