设计模式之责任链模式(Chain of Responsibity)
来源:互联网 发布:淘宝特种经营报名入口 编辑:程序博客网 时间:2024/06/07 01:51
1.解析
定义 :
使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
UML :
2.实例
背景描述 :
在前面的场景中 ,我们使用的是餐厅的例子 ,在这里可以继续延用 : 薪资问题
人员结构 :
* 基层 : 服务员 ,洗碗工
* 中层 :大厅经理,后厨主任
* 上层 :总经理
* 高层 :老板
* 强级 :老板娘
场景 :
* 基层 : 想要申请 加薪;
* 中层: 最高给 其 加薪 1000元
* 高层 :最高给其加薪 2000元
* 老板 :最高给其加薪 3000元
* 老板娘 : 最高给其加薪 4000元 或者 “ 不干滚蛋 ”
实现步骤 :
层级结构构建 : 管理层实现
(1)实现 SalaryHandler : 抽象类 ,抽象方法 :addSalary(int salary);
public abstract class SalaryHandler { //用于构建 责任链 的 链 ,是 所有层级(除了基层)的父类 private SalaryHandler salaryHandler; public SalaryHandler getSalaryHandler() { return salaryHandler; } public void setSalaryHandler(SalaryHandler salaryHandler) { this.salaryHandler = salaryHandler; } public abstract void addSalary(int salary);}
(2)中层人员实现 : 大厅经理 ,后厨主任 ,控制加薪 1000元以内
public class ZhongCengHandler extends SalaryHandler {/** * 中层实现 */ @Override public void addSalary(int salary) { if(salary<=1000){ System.out.println(this.getClass().getName()+" :给 您加薪 "+salary+" 元"); }else{ getSalaryHandler().addSalary(salary); } }}
(3)高层人员 : 总经理 ,控制加薪 2000元
public class GaoCengHandler extends SalaryHandler{ /** * 高层实现 */ @Override public void addSalary(int salary) { if(salary<=2000){ System.out.println(this.getClass().getName()+" :给 您加薪 "+salary+" 元"); }else{ getSalaryHandler().addSalary(salary); } }}
(4) Boss 老板 :控制加薪 3000元
public class BossHandler extends SalaryHandler { /** * 老板 最多加薪 3000元 * */ @Override public void addSalary(int salary) { if(salary<3000){ System.out.println(this.getClass().getName()+" :给 您加薪 "+salary+" 元"); }else{ getSalaryHandler().addSalary(salary); } }}
(5) BossWife : 老板娘 ,控制加薪4000元 和 辞员
public class BossWifeHandler extends SalaryHandler{ /** * 老板娘 4000元 * 或 滚蛋 */ @Override public void addSalary(int salary) { if(salary<4000){ System.out.println(this.getClass().getName()+" :给您加薪 "+salary+" 元"); }else{ System.out.println(this.getClass().getName()+" : 不干滚蛋 !"); } }}
层级结构实现 : 关联各个层之间的衔接
(6) SalaryFactory : 使用简单工厂模式 实现 各层之间的关联
public class SalaryFactory { /** * 关联起来 所有的 层 */ public static SalaryHandler getSalaryHandlerInstance(){ ZhongCengHandler zhongCengHandler=new ZhongCengHandler(); GaoCengHandler gaoCengHandler=new GaoCengHandler(); BossHandler bossHandler=new BossHandler(); BossWifeHandler bossWifeHandler=new BossWifeHandler(); //关联 zhongCengHandler.setSalaryHandler(gaoCengHandler); gaoCengHandler.setSalaryHandler(bossHandler); bossHandler.setSalaryHandler(bossWifeHandler); return zhongCengHandler; }}
层级结构实现 : 基层实现
(7) JiCengPerson : 基层人员 实现 申请加薪
public class JiCengPerson { private String name; public JiCengPerson(String name) { this.name = name; } /** * 给上级说 */ public void sayAddSalary(int salary) { System.out.println(name + " : 我要加薪 " + salary + "元 !!!懂?"); SalaryHandler handler = SalaryFactory.getSalaryHandlerInstance(); handler.addSalary(salary); }}
测试实现
(8)测试
public static void main(String[] args) { //基层提出 加薪 JiCengPerson xw=new JiCengPerson("小王"); xw.sayAddSalary(1100); JiCengPerson xy=new JiCengPerson("小原"); xy.sayAddSalary(5100); }
结果 :
3.优缺点
优点:
1. 将请求的发送者和接收者解耦 ;
2. 可以简化你的对象,因为它不需要知道链的结构 ;
3. 通过改变链内的成员或调动他们的次序,允许你动态地新增或删除责任;
缺点:
1. 并不保证请求一定会被执行,如果没有任何对象处理它的话,它可能会落到链尾端 之外 ;
2. 可能不容观察运行时的特征,有碍于除错。
3. 开始就会加载很多实例,消耗内存
4.使用场景
(1)有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。
(2)你想在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
(3)可处理一个请求的对象集合应被动态指定。
5.Demo 免积分下载
http://download.csdn.net/detail/lablenet/9304489
- 设计模式之责任链模式(Chain of Responsibity)
- 设计模式之---责任链模式(Chain of Responsibility)
- 设计模式之责任链模式(Chain of Responsibility)
- 设计模式之责任链(Chain of Responsibility)
- 设计模式之-责任链(Chain of responsibility )
- 设计模式之责任链Chain of Responsibility模式
- 设计模式之责任链模式(Chain of Responsibility)
- 设计模式之责任链模式--- Pattern chain-of-responsibility
- 设计模式之13 - 责任链模式Chain Of Responsibility
- 设计模式拾荒之责任链模式 ( Chain of Responsibility)
- java设计模式-责任链模式(Chain Of Resposibility)
- 浅谈设计模式:责任链模式(Chain Of Responsibility)
- Java设计模式----责任链模式(Chain of Responsibility)
- 设计模式:责任链模式(Chain of Responsibility)
- 设计模式:责任链模式(Chain of Responsibility)
- 设计模式:责任链模式(Chain of Responsibility)
- 设计模式(17)-责任链模式(Chain of Responsibility)
- 设计模式_责任链模式(Chain Of Responsibility)
- Zookeeper集群安装及命令
- Android自定义通知布局Notification,点击Notification导航切换回原Activity
- android插件话和hotfix
- 计算机视觉著名数据集CV Datasets
- 使用视图控制器容器(翻译自苹果官方文档 Implementing a Container View Controller)
- 设计模式之责任链模式(Chain of Responsibity)
- 《剑指Offer》读书笔记03:从尾到头打印链表
- AMD与CDM RequireJS与SeaJS CommonJS 的认识
- linux经验之用scp远程传输文件/文件夹
- 深度与广度 总结
- 如何实现微信等navigationbar加上UIActivityIndicatorView
- LeetCode 172 : Factorial Trailing Zeroes (Java)
- 培训机构毕业的程序员被歧视的背后逻辑
- Java NIO (九) ServerSocketChannel