职责链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

适用场景:

1、有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定;

2、在不明确指定接收者的情况下,向多个对象中的一个提交一个请求;

3、处理一个请求的对象集合应被动态指定。

Handler:

package com.sjmx.responsibility.application;public abstract class Handler {/*** 持有下一个处理请求的对象*/protected Handler successor = null;/*** 取值方法*/public Handler getSuccessor() {return successor;}/*** 设置下一个处理请求的对象*/public void setSuccessor(Handler successor) {this.successor = successor;}/*** 处理聚餐费用的申请* * @param user*            申请人* @param fee*            申请的钱数* @return 成功或失败的具体通知*/public abstract String handleFeeRequest(String user, double fee);
}

ProjectManager:

package com.sjmx.responsibility.application;public class ProjectManager extends Handler {@Overridepublic String handleFeeRequest(String user, double fee) {String str = "";// 项目经理权限比较小,只能在500以内if (fee < 500) {// 为了测试,简单点,只同意张三的请求if ("张三".equals(user)) {str = "成功:项目经理同意【" + user + "】的聚餐费用,金额为" + fee + "元";} else {// 其他人一律不同意str = "失败:项目经理不同意【" + user + "】的聚餐费用,金额为" + fee + "元";}} else {// 超过500,继续传递给级别更高的人处理if (getSuccessor() != null) {return getSuccessor().handleFeeRequest(user, fee);}}return str;}}

DeptManager:

package com.sjmx.responsibility.application;public class DeptManager extends Handler {@Overridepublic String handleFeeRequest(String user, double fee) {String str = "";// 部门经理的权限只能在1000以内if (fee < 1000) {// 为了测试,简单点,只同意张三的请求if ("张三".equals(user)) {str = "成功:部门经理同意【" + user + "】的聚餐费用,金额为" + fee + "元";} else {// 其他人一律不同意str = "失败:部门经理不同意【" + user + "】的聚餐费用,金额为" + fee + "元";}} else {// 超过1000,继续传递给级别更高的人处理if (getSuccessor() != null) {return getSuccessor().handleFeeRequest(user, fee);}}return str;}}

GeneralManager:

package com.sjmx.responsibility.application;public class GeneralManager extends Handler {@Overridepublic String handleFeeRequest(String user, double fee) {String str = "";// 总经理的权限很大,只要请求到了这里,他都可以处理if (fee >= 1000) {// 为了测试,简单点,只同意张三的请求if ("张三".equals(user)) {str = "成功:总经理同意【" + user + "】的聚餐费用,金额为" + fee + "元";} else {// 其他人一律不同意str = "失败:总经理不同意【" + user + "】的聚餐费用,金额为" + fee + "元";}} else {// 如果还有后继的处理对象,继续传递if (getSuccessor() != null) {return getSuccessor().handleFeeRequest(user, fee);}}return str;}}

客户端:

package com.sjmx.responsibility.application;public class Client {public static void main(String[] args) {  //先要组装责任链  Handler h1 = new GeneralManager();  Handler h2 = new DeptManager();  Handler h3 = new ProjectManager();  h3.setSuccessor(h2);  h2.setSuccessor(h1);  //开始测试  String test1 = h3.handleFeeRequest("张三", 300);  System.out.println("test1 = " + test1);  String test2 = h3.handleFeeRequest("李四", 300);  System.out.println("test2 = " + test2);  System.out.println("---------------------------------------");  String test3 = h3.handleFeeRequest("张三", 700);  System.out.println("test3 = " + test3);  String test4 = h3.handleFeeRequest("李四", 700);  System.out.println("test4 = " + test4);  System.out.println("---------------------------------------");  String test5 = h3.handleFeeRequest("张三", 1500);  System.out.println("test5 = " + test5);  String test6 = h3.handleFeeRequest("李四", 1500);  System.out.println("test6 = " + test6);  }  }

test1 = 成功:项目经理同意【张三】的聚餐费用,金额为300.0元
test2 = 失败:项目经理不同意【李四】的聚餐费用,金额为300.0元
---------------------------------------
test3 = 成功:部门经理同意【张三】的聚餐费用,金额为700.0元
test4 = 失败:部门经理不同意【李四】的聚餐费用,金额为700.0元
---------------------------------------
test5 = 成功:总经理同意【张三】的聚餐费用,金额为1500.0元
test6 = 失败:总经理不同意【李四】的聚餐费用,金额为1500.0元

案例二:职责连模式与桥接模式整合

接口1系列

package com.net.sjms.responsiblity;
/*** @author * @Time:2017年8月14日 下午5:26:08* @version 1.0* @description*/
public abstract class Employ {private String name;public String getName(){return name;}public void setName(String name){this.name = name;}public abstract void apply(Handler handler, double money);public abstract void getMsg(String title, String msg);}

package com.net.sjms.responsiblity;
/*** @author * @Time:2017年8月14日 下午5:39:18* @version 1.0* @description*/
public class Empoy1 extends Employ {@Overridepublic void apply(Handler handler, double money){handler.salery(this, money);}@Overridepublic void getMsg(String title, String msg){System.out.println(title);System.out.println("     " + msg);}}

接口2系列

package com.net.sjms.responsiblity;/*** @author * @Time:2017年8月14日 下午5:18:13* @version 1.0* @description*/
public abstract class Handler {public Handler nextNode;public Handler getNextNode(){return nextNode;}public void setNextNode(Handler nextNode){this.nextNode = nextNode;}public abstract  void salery(Employ employ, double money);
}

package com.net.sjms.responsiblity;
/*** @author * @Time:2017年8月14日 下午5:21:50* @version 1.0* @description*/
public class FirstDev extends Handler {@Overridepublic void salery(Employ employ, double money){if(money < 1000){employ.getMsg("来自FirstDev部门的邮件", employ.getName() + "你好,本部门同意你的加申请");}else{getNextNode().salery(employ, money);}}    }

package com.net.sjms.responsiblity;
/*** @author * @Time:2017年8月14日 下午5:22:07* @version 1.0* @description*/
public class SecDev extends Handler {@Overridepublic void salery(Employ employ, double money){if(money < 2000){employ.getMsg("来自SecDev部门的邮件", employ.getName() + "你好,本部门同意你的加申请");}else{getNextNode().salery(employ, money);}}
}

package com.net.sjms.responsiblity;/*** @author * @Time:2017年8月14日 下午5:37:59* @version 1.0* @description*/
public class ThridDev extends Handler {@Overridepublic void salery(Employ employ, double money){if (money < 3000) {employ.getMsg("来自ThridDev部门的邮件", employ.getName() + "你好,本部门同意你的加申请");} else {employ.getMsg("来自ThridDev部门的邮件", employ.getName() + "你好,你申请的加薪金额过大,公司无法满足你的需求!");}}}

package com.net.sjms.responsiblity;
/*** @author  * @Time:2017年8月14日 下午5:43:38* @version 1.0* @description*/
public class Client {public static void main(String[] args){Handler handler1 = new FirstDev();Handler handler2 = new SecDev();Handler handler3 = new ThridDev();handler1.setNextNode(handler2);handler2.setNextNode(handler3);Empoy1 e1 = new Empoy1();e1.setName("张三");e1.apply(handler1, 1500);Empoy1 e2 = new Empoy1();e2.setName("李四");e2.apply(handler1, 3500);}}

运行结果:

来自SecDev部门的邮件张三你好,本部门同意你的加申请
来自ThridDev部门的邮件李四你好,你申请的加薪金额过大,公司无法满足你的需求!

说明:桥接模式一般是一个抽象类持有另一个接口,而我在此处稍微的做了变化,是将一个接口的具体实现类当做参数传递,希望你还认识桥接模式哦 @

转载于:https://www.cnblogs.com/chen1-kerr/p/7197994.html

【行为型模式】《大话设计模式》——读后感 (16)加薪非要老板批?——职责链模式...相关推荐

  1. 【设计模式】加薪非要老总批 --- 职责链模式

    一,概述 定义:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为之. 优点:客户提出请求时,请求时沿链传递直 ...

  2. 设计模式:24 加薪非要老总批?_职责链模式

    职责链模式: 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. Handler:定义一个处理请示的接口. ...

  3. 图解Java设计模式学习笔记——行为型模式(模版方法模式、命令模式、访问者模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、职责链模式)

    一.模板方法模式(模板模式)--钩子方法 1.需求-豆浆制作问题 编写制作豆浆的程序,说明如下: 制作豆浆的流程选材-->添加配料-->浸泡-->放到豆浆机打碎. 通过添加不同的配料 ...

  4. 设计模式之职责链模式、减小了因为分支带来的耦合

    1. 定义 职责链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这个对象连成一条链,并沿着这条链传递该请求,直到有一 ...

  5. 十八、职责链模式-推卸责任,不关我的事,我不管!#和设计模式一起旅行#

    不在其位,不谋其政! –出自<论语·泰伯> 故事背景 在现实世界中,有很多情况下会遇到一些推卸责任的场景,比如要办理一件事的时候,被告诉你要去做个做这个事情,但是去了这个地方,确告诉要到另 ...

  6. 设计模式与软考试题之职责链模式

    2007年下半年软件设计师考试下午试题最后一题考查职责链模式(责任链模式),原题如下: [全国计算机技术与软件专业技术资格(水平)考试 2007年下半年 软件设计师 下午试卷] 注:当年试题五.试题六 ...

  7. 第 26 章 职责链模式

    第 26 章 职责链模式 1.OA 系统采购审批需求 学校 OA 系统的采购审批项目: 需求是采购员采购教学器材 如果金额 小于等于 5000,由教学主任审批 (0<=x<=5000) 如 ...

  8. 从装饰模式和职责链模式看链式结构模式

    装饰模式(Decorator Pattern) 动态给对象增加功能,从一个对象的外部来给对象添加功能,相当于改变了对象的外观,比用继承的方式更加的灵活. 允许向一个现有的对象添加新的功能,同时又不改变 ...

  9. 职责链模式之真假美猴王

    孙悟空最终还是没有能逃脱如来的手掌心,因缘注定,皈依佛门,虽没有了做齐天大圣是的逍遥快活,也没有大闹天宫时的轰轰烈烈,但是现在有了更重要的一项任务,那就是普度众生,< 西游记>第五十七回, ...

最新文章

  1. 初探Git git基本用法
  2. 如何添加自动更新Play Framework 2.X项目的版本号
  3. 【报告分享】腾讯研究院-AI生成内容报告2020.pdf(附下载链接)
  4. 转专业有什么要求吗?
  5. Python之if语句
  6. 启示录:新加坡纬壹科技城成功建设经验
  7. 甲方在IT信息化中的项目管理
  8. Excel双样本T检验之异方差检验
  9. struts2 数据校验
  10. 如何在 LaTeX 中画一个树状图(使用tikz和tikz-qtree包中的宏绘制树、森林、二叉树)
  11. 文本分类入门(一)文本分类问题的定义
  12. 什么是嵌入式?那嵌入式为什么用C语言?为什么不用其他语言?
  13. 建立大学生职业成长规划4个步骤
  14. 树的中序遍历+前序遍历得到后序遍历
  15. 智慧环保三维可视化决策系统平台(数字孪生)-解决方案开发案例
  16. php新闻增删改查操作
  17. THE BUTTON OF HABIT IS ON
  18. idea支付宝扫一扫支付 史上最详细支付宝支付入门
  19. 【选择恐惧症】需不需要通用设计?
  20. 如何取消PDF文档中的高亮显示

热门文章

  1. php文件上传空间,PHP上传文件-PHP多文件上传
  2. 使用java搭建直播平台,我就不信你还听不明白了!
  3. java继承的生活例子,帮你突破瓶颈
  4. 分分钟入门【Nodejs】—初步了解Nodejs
  5. Python程序设计题解【蓝桥杯官网题库】 DAY10-算法训练
  6. 机器学习(MACHINE LEARNING) 【周志华版-”西瓜书“-笔记】 DAY3-线性模型
  7. 算法训练 素因子去重
  8. 智能集群理论优化控制_无人机集群对抗研究的关键问题
  9. modelsim读取文件中的数据_modelsim中的文件操作—— 大数据测试
  10. python2 队列的使用_python双端队列原理、实现与使用方法分析