设计模式(24)-----责任链模式
2016-06-29 18:21
423 查看
责任链模式(chain of responsibility)
定义
责任链模式是对象的行为模式。使多个对象都有机会处理请求,从而避免请求的发送者和接受者直接的耦合关系。将这些对象连成一条链,沿着这条链传递该请求,直到有一个对象处理它为止。UML类图
角色
抽象处理者(Handler)角色 :定义一个请求的接口。如果需要可以定义个一个方法用来设定和返回下家对象的引用。具体处理者(ConcreteHandler)角色 :如果可以处理就处理请求,如果不能处理,就把请求传给下家,让下家处理。也就是说它处理自己能处理的请求且可以访问它的下家。
例子
有人想请假,小组长只能审批小于等于1天的假期,项目经理可以审批小于等于3天的假期,CEO可以审批所有的假期。Handler
package com.csdhsm.designpattem.chainofresponsibility; /** * @Title: Handler.java * @Description: 审批请假抽象类 * @author: Han * @date: 2016年6月29日 下午6:05:46 */ public abstract class Handler { protected Handler handler; public Handler getHandler() { return handler; } public void setHandler(Handler handler) { this.handler = handler; } //审批方法 public abstract void approve(int day); }
GroupLeader(小组长)
package com.csdhsm.designpattem.chainofresponsibility; /** * @Title: GroupLeader.java * @Description: 小组长,能审批的是小于等于1天的请假申请 * @author: Han * @date: 2016年6月29日 下午5:58:29 */ public class GroupLeader extends Handler { @Override public void approve(int day) { if(day <= 1) { System.out.println("小组长审批"); } else { System.out.println("超过了小组长权限,移交上级"); this.getHandler().approve(day); } } }
ProjectManager(项目经理)
package com.csdhsm.designpattem.chainofresponsibility; /** * @Title: ProjectManager.java * @Description: 项目经理,能审批的是小于等于3天的请假 * @author: Han * @date: 2016年6月29日 下午6:01:49 */ public class ProjectManager extends Handler { @Override public void approve(int day) { if(day <= 3) { System.out.println("项目经理审批"); } else { System.out.println("超过了项目经理权限,移交上级"); getHandler().approve(day); } } }
CEO
package com.csdhsm.designpattem.chainofresponsibility; /** * @Title: CEO.java * @Description: 最后移交到CEO审批 * @author: Han * @date: 2016年6月29日 下午6:03:59 */ public class CEO extends Handler { @Override public void approve(int day) { System.out.println("CEO审批"); } }
客户端
package com.csdhsm.designpattem.chainofresponsibility; public class Solution { public static void main(String[] args) { Handler leader = new GroupLeader(); Handler manager = new ProjectManager(); Handler ceo = new CEO(); //把Handler连成一条链 leader.setHandler(manager); manager.setHandler(ceo); //处理请求 leader.approve(6); } }
结果
OK,成功!
总结
优点调用者不需知道具体谁来处理请求,也不知道链的具体结构,降低了节点域节点的耦合度;可在运行时动态修改链中的对象职责,增强了给对象指派职责的灵活性。
缺点
没有明确的接收者,可能传到链的最后,也没得到正确的处理。
相关文章推荐
- MAC JDK版本切换
- 在ubuntu下安装配置jdk
- Think PHP(TP)框架的基本使用 (二)
- ssh 免密码登陆
- linux 配置svn服务器+使用+注意事项
- 系统运行日志基础数据分析
- ReactiveCocoa框架菜鸟入门(四)——信号(Signal)详解
- runtime为类目扩展属性
- jdbc连接数据库使用sid和service_name的区别
- android:打造万能通用适配器
- 长个见识——第六届可穿戴大会
- 欢迎使用CSDN-markdown编辑器
- bzoj 4237: 稻草人
- 判断浏览器类型
- SignalR+AForge实现视频会话[WPF]
- Android下的多线程通信机制
- 虚拟机中的锁优化简介(适应性自旋/锁粗化/锁削除/轻量级锁/偏向锁)
- React Native Android
- 基于OpenCV的双目测距系统实现
- Android多渠道打包