【行为型模式】《大话设计模式》——读后感 (16)加薪非要老板批?——职责链模式...
职责链模式(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)加薪非要老板批?——职责链模式...相关推荐
- 【设计模式】加薪非要老总批 --- 职责链模式
一,概述 定义:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为之. 优点:客户提出请求时,请求时沿链传递直 ...
- 设计模式:24 加薪非要老总批?_职责链模式
职责链模式: 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. Handler:定义一个处理请示的接口. ...
- 图解Java设计模式学习笔记——行为型模式(模版方法模式、命令模式、访问者模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、职责链模式)
一.模板方法模式(模板模式)--钩子方法 1.需求-豆浆制作问题 编写制作豆浆的程序,说明如下: 制作豆浆的流程选材-->添加配料-->浸泡-->放到豆浆机打碎. 通过添加不同的配料 ...
- 设计模式之职责链模式、减小了因为分支带来的耦合
1. 定义 职责链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这个对象连成一条链,并沿着这条链传递该请求,直到有一 ...
- 十八、职责链模式-推卸责任,不关我的事,我不管!#和设计模式一起旅行#
不在其位,不谋其政! –出自<论语·泰伯> 故事背景 在现实世界中,有很多情况下会遇到一些推卸责任的场景,比如要办理一件事的时候,被告诉你要去做个做这个事情,但是去了这个地方,确告诉要到另 ...
- 设计模式与软考试题之职责链模式
2007年下半年软件设计师考试下午试题最后一题考查职责链模式(责任链模式),原题如下: [全国计算机技术与软件专业技术资格(水平)考试 2007年下半年 软件设计师 下午试卷] 注:当年试题五.试题六 ...
- 第 26 章 职责链模式
第 26 章 职责链模式 1.OA 系统采购审批需求 学校 OA 系统的采购审批项目: 需求是采购员采购教学器材 如果金额 小于等于 5000,由教学主任审批 (0<=x<=5000) 如 ...
- 从装饰模式和职责链模式看链式结构模式
装饰模式(Decorator Pattern) 动态给对象增加功能,从一个对象的外部来给对象添加功能,相当于改变了对象的外观,比用继承的方式更加的灵活. 允许向一个现有的对象添加新的功能,同时又不改变 ...
- 职责链模式之真假美猴王
孙悟空最终还是没有能逃脱如来的手掌心,因缘注定,皈依佛门,虽没有了做齐天大圣是的逍遥快活,也没有大闹天宫时的轰轰烈烈,但是现在有了更重要的一项任务,那就是普度众生,< 西游记>第五十七回, ...
最新文章
- 初探Git git基本用法
- 如何添加自动更新Play Framework 2.X项目的版本号
- 【报告分享】腾讯研究院-AI生成内容报告2020.pdf(附下载链接)
- 转专业有什么要求吗?
- Python之if语句
- 启示录:新加坡纬壹科技城成功建设经验
- 甲方在IT信息化中的项目管理
- Excel双样本T检验之异方差检验
- struts2 数据校验
- 如何在 LaTeX 中画一个树状图(使用tikz和tikz-qtree包中的宏绘制树、森林、二叉树)
- 文本分类入门(一)文本分类问题的定义
- 什么是嵌入式?那嵌入式为什么用C语言?为什么不用其他语言?
- 建立大学生职业成长规划4个步骤
- 树的中序遍历+前序遍历得到后序遍历
- 智慧环保三维可视化决策系统平台(数字孪生)-解决方案开发案例
- php新闻增删改查操作
- THE BUTTON OF HABIT IS ON
- idea支付宝扫一扫支付 史上最详细支付宝支付入门
- 【选择恐惧症】需不需要通用设计?
- 如何取消PDF文档中的高亮显示
热门文章
- php文件上传空间,PHP上传文件-PHP多文件上传
- 使用java搭建直播平台,我就不信你还听不明白了!
- java继承的生活例子,帮你突破瓶颈
- 分分钟入门【Nodejs】—初步了解Nodejs
- Python程序设计题解【蓝桥杯官网题库】 DAY10-算法训练
- 机器学习(MACHINE LEARNING) 【周志华版-”西瓜书“-笔记】 DAY3-线性模型
- 算法训练 素因子去重
- 智能集群理论优化控制_无人机集群对抗研究的关键问题
- modelsim读取文件中的数据_modelsim中的文件操作—— 大数据测试
- python2 队列的使用_python双端队列原理、实现与使用方法分析