设计模式-职责链模式 (分离职责,动态组合)
为什么80%的码农都做不了架构师?>>>
一:业务场景
我们申请聚餐经费的审批:
项目经理只能审批500元以下的,
部门经理可以审批1000元以下的,
总经理可以审批1000元以上的
二:看看我们不用设计模式的平时代码逻辑
/*** 处理聚餐费用的对象* @author dy* @since 2016-08-12 & JDK 1.8.0_91*/ public class FeeRequest_demo {public String requestToProjectManager(String user,double fee){String result = "";if (fee<500)result = this.projectManagerHandler(user, fee);else if (fee< 1000)result = this.dptManagerHandler(user, fee);else if (fee>1000)result = this.generalManagerHandler(user, fee);return result;}private String projectManagerHandler(String user,double fee){return "项目经理同意给你报销:"+fee;}private String dptManagerHandler(String user,double fee){return "部门经理同意给你报销:"+fee;}private String generalManagerHandler(String user,double fee){return "总经理同意给你报销:"+fee;}
这里例子比较简单,主要是学习设计模式,又不是学习处理业务的,哈哈
ok,我们来测试下
public static void main(String[] args) {FeeRequest_demo feeRequest =new FeeRequest_demo();System.out.println(feeRequest.requestToProjectManager("", 300));System.out.println(feeRequest.requestToProjectManager("", 600));System.out.println(feeRequest.requestToProjectManager("", 1200));}
思考,以上代码有什么问题?实际业务场景中,我们的审批流程经常变更,业务处理也经常变更,这就要求我们必须设计更加灵活的程序。
三:职责链设计模式
定义:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。并将这些对象形成一条链,并沿着这条链传递该请求,直到有一个对象处理了它为止。
四:使用设计模式重写示例:
/*** 定义职责对象接口* @author dy* @since 2016-08-12 & JDK 1.8.0_91*/ public abstract class Handler {/*** 通常持有下一个处理的请求对象*/protected Handler nextHandler;public Handler(Handler nextHandler) {this.nextHandler = nextHandler;}/*** 处理申请* @param user* @param fee* @return*/public abstract String requestToFee(String user,double fee); }
public class ProjectManagerHandler extends Handler {public ProjectManagerHandler(Handler nextHandler) {super(nextHandler);}@Overridepublic String requestToFee(String user, double fee) {if (fee<500){return "项目经理同意给你报销:"+fee;}else{if (nextHandler != null) {return nextHandler.requestToFee(user, fee);}}return "非法处理";} }
public class DptManagerHandler extends Handler {public DptManagerHandler(Handler nextHandler) {super(nextHandler);}@Overridepublic String requestToFee(String user, double fee) {if (fee<1000){return "部门经理同意给你报销:"+fee;}else{if (nextHandler != null) {return nextHandler.requestToFee(user, fee);}}return "非法处理";} }
public class GeneralManagerHandler extends Handler {public GeneralManagerHandler(Handler nextHandler) {super(nextHandler);}@Overridepublic String requestToFee(String user, double fee) {if (fee>1000){return "总经理同意给你报销:"+fee;}else{if (nextHandler != null) {return nextHandler.requestToFee(user, fee);}}return "非法处理";} }
ok,让我们来测试下吧!
/*** @author dy* @since 2016-08-12 & JDK 1.8.0_91*/ public class Client {public static void main(String[] args) {/*** 组装职责链*/Handler generalHandler = new GeneralManagerHandler(null);Handler depHandler = new DptManagerHandler(generalHandler);Handler prjHandler = new ProjectManagerHandler(depHandler);System.out.println(prjHandler.requestToFee("", 300));System.out.println(prjHandler.requestToFee("", 600));System.out.println(prjHandler.requestToFee("", 1200));} }
运行结果:
是不是和没有设计模式的 运行结果一抹一眼啊 !
这里就不演示处理多种请求了 ,大同小异的!
想想我们平时用到的拦截器,是不是用到了职责链设计模式啊!看来这个也很重要哦
转载于:https://my.oschina.net/dyyweb/blog/731924
设计模式-职责链模式 (分离职责,动态组合)相关推荐
- Java设计模式——责任链模式(职责链模式)详解
模式的定义与特点 责任链(Chain of Responsibility)模式的定义:为了避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链:当 ...
- 责任链模式(分离职责,动态组合)
目录 1 定义 2 本质与要点 3 类图 4 优缺点 5 使用场景 6 代码实现 1 定义 使多个对象都有机会处理请求,从⽽避免请求的发送者和接收者之间的耦合关系.将这些对象连成⼀条链,并沿着这条链传 ...
- 责任链模式——分离职责,动态组合
责任链模式是将一连串的业务职责进行细分,使多个对象各自负责其中一部分的职责,然后将这些对象连城一条链,将请求沿着这条链进行传递,直到将这个业务逻辑处理完成为止.责任链模式可以用于整条链都是在处理一 ...
- 深入理解设计模式-责任链模式(职责链模式)
文章目录 一.定义 二.使用场景 三.代码样例 1.需求 2.设计一个所有处理器都要实现的接口 3.实现各种处理器 4.客户端 5. 输出 四.要点与优缺点 结尾 一.定义 避免请求发送者与接收者耦合 ...
- C#设计模式学习笔记:(20)职责链模式
本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/8109100.html,记录一下学习过程以备后续查用. 一.引言 今天我们要讲行为型设计模式的第八个模式--职 ...
- JBPM与设计模式之职责链模式
上篇我们了解并学习了JBPM的长事务实现,其中用到了设计模式中的职责链模式和命令模式:这块还是很有厚重感的,我们可以从中学到很多的东西:今天我们先来学习一下职责链模式. 职责链模式定义 使多个对象都有 ...
- js设计模式之职责链模式
一. 初始职责链模式 定义:使多个对象都有机会处理请求,从而避免请求的发送者和接收者的关系,将这个对象连成一条链,并沿着一条链传递该请求,直到一个对象处理它为止. 可能有点晦涩难懂,我们来看一个例子, ...
- JS设计模式五:职责链模式
职责链模式简述 职责连是由多个不同的对象组成的,有发送者跟接收者,分别负责信息的发送跟接收,其中,链中第一个对象是 职责连是由多个不同的对象组成的,发送者是发送请求的对象,接收者接收请求并且对其进行处 ...
- golang设计模式——职责链模式
职责链模式 目录 职责链模式 分析 应用场景 代码实现 实例 代码 单元测试 Gin 的中间件实现 总结 职责链将处理模块串联成链,请求沿着链条被处理,提供了很好的扩展性,而且能够去掉if-else. ...
- 请求的链式处理——职责链模式
本文转载自 :http://blog.csdn.net/lovelion/article/details/7420891 "一对二","过","过&q ...
最新文章
- 如何在Leangoo中,为企业创建项目
- python的功能模块_Python的功能模块[1] - struct - struct 在网络编程中的使用
- 如何使用一个单片机的IO口控制两个LED?
- 百度地图离线_“高德地图”和“百度地图”有什么差别? 专家: 细节决定成败!...
- c++输出的值精确到小数点后5位_七年级上册第一章有理数专讲专练(适合暑期预习后巩固)...
- PMCAFF| 产品设计,从警示框说起
- 【蚁剑的安装与使用+例题实战】【CTF】webshell
- STM32 - 定时器的设定 - 基础 01 - Timer Base - Prescaler description - Upcounting mode
- STM32-OLED显示
- python RE表达式规则剩余规则
- pytorch的余弦退火学习率
- IDEA插件(BindED)——查看class文件的十六进制
- dis的前缀单词有哪些_下面是总结的一些英语单词记忆前
- android ui开发知乎,实现知乎app的主界面效果
- 冬色烂漫 纯情踏雪 论著名画家冯庆冰雪画作品
- M2DGR:多源多场景 地面机器人SLAM数据集(ICRA 2022 )
- Poi读取大数据量Excel文件
- 讼卦,帮助你处理好和上级的关系
- Istio 流量管理 virtualservice (1)
- 「正定矩阵」和「半正定矩阵」
热门文章
- C语言基础教程之如何定义变量
- 继承的作用是什么?看看下面这些例子吧!
- mac下,vagrant桥接,选择“en0: 以太网”无法启动虚拟机解决方案
- Windows10与Vmware配置Windowsserver2003共享磁盘
- CetnOS 6.7安装Hive 1.2.1
- JS屏蔽360浏览器代码
- 建设局项目总结(一)
- Ubuntu 16.04 x64 常用软件
- 【数字全排列】LeetCode 46. Permutations
- 初学QT遇到的“_on_OK_clicked(bool)未定义的引用”的问题,以及使用windows远程桌面登录树莓派