设计模式(三)- 责任链模式
职责链模式
文章目录
- 职责链模式
- 1.职责链模式
- 1.介绍
- 2.应用实例
- 代码
- 1.员工提交请求类:LeaveRequest
- 2. 抽象请假处理类:AbstractLeaveHandler
- 3.直接主管审批处理类:DirectLeaderHandler
- 4.部门经理处理类:DepartmentManagerHandler
- 5.总经理处理类: CompanyManagerHandler
- 结果
1.职责链模式
责任链,顾名思义,就是用来处理相关事务责任的一条执行链,执行链上有多个节点,每个节点都有机会(条件匹配)处理请求事务,如果某个节点处理完了就可以根据实际业务需求传递给下一个节点继续处理或者返回处理完毕。
1.介绍
意图:避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求进行处理,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。
主要解决:一个事件需要经过多个对象处理是很常见的场景。
关键代码:Handler 里面聚合它自己,在 HandlerRequest 里判断是否合适,如果没达到条件则向下传递,向谁传递之前 set 进去。
2.应用实例
现实中,请假的OA申请:
请假天数如果是1天,可能直接主管批准即可;
如果是1到7天的假期,需要部门经理批准;
如果是7天到30天,则需要总经理审批;
大于30天,正常不会批准
优点: 1、降低耦合度。它将请求的发送者和接收者解耦。 2、简化了对象。使得对象不需要知道链的结构。 3、增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任。 4、增加新的请求处理类很方便。
缺点: 1、不能保证请求一定被接收。 2、系统性能将受到一定影响,而且在进行代码调试时不太方便,可能会造成循环调用。
代码
为了实现上述场景,我们可以采用责任链设计模式。
- 员工请假请求类:LeaveRequest。
- 抽象的请假责任处理类:AbstractLeaveHandler。
- 直接主管审批处理类:DirectLeaderHandler。
- 部门经理处理类:DepartmentManagerHandler。
- 总经理处理类: CompanyManagerHandler。
1.员工提交请求类:LeaveRequest
package com.jzj.design.demo.responsibilityDesign;import lombok.Data;
import lombok.NoArgsConstructor;/*** 请假请求封装*/
@Data
@NoArgsConstructor
public class LeaveRequest {/*** 员工编号*/private String employeeId;/*** 员工姓名*/private String employeeName;/*** 员工请假天数*/private Integer leaveDays;public LeaveRequest(String employeeId, String employeeName, Integer leaveDays) {this.employeeId = employeeId;this.employeeName = employeeName;this.leaveDays = leaveDays;System.out.println("员工:"+employeeId+" 姓名:"+employeeName+" 申请请假 "+leaveDays+" 天");}
}
2. 抽象请假处理类:AbstractLeaveHandler
AbstractLeaveHandler 中定义了2个抽象方法
- public abstract String getApproveName(); 设置审批人名字,由子类去具体实现
- public abstract Integer getLimitDays(); 设置审批人可以处理的天数,由子类去具体实现
package com.jzj.design.demo.responsibilityDesign;/*** 抽象的责任链处理类*/
public abstract class AbstractLeaveHandler {/*** !!!!! 定义下一个处理节点*/private AbstractLeaveHandler nextHandler;/*** 设置下一个 处理节点** @param nextHandler*/public void setNextHandler(AbstractLeaveHandler nextHandler) {this.nextHandler = nextHandler;}/*** 抽象类 ->审批人名字; 由子类去实现*/public abstract String getApproveName();/*** 抽象类-> 由子类去设置 每一个审批人 可以处理 处理的请假天数*/public abstract Integer getLimitDays();/*** 处理请假请求, 由他的子类来实现** @param leaveRequest*/public void handlerLeaveRequest(LeaveRequest leaveRequest) {//如果 权限限制的天数 > 请假的天数,说明由权限审批if (getLimitDays() >= leaveRequest.getLeaveDays()) {System.out.println("当前处理人" + getApproveName() + " 同意 请假请求");} else if (this.nextHandler != null) {//依旧有人可以处理审批this.nextHandler.handlerLeaveRequest(leaveRequest);} else {System.out.println("没有人------ 能够同意 请假请求!!");}}
}
3.直接主管审批处理类:DirectLeaderHandler
直接主管处理类,继承抽象类 AbstractLeaveHandler,实现他的方法去自定义 可以处理天数LimitDays 1天 及审批人名字ApproveName
package com.jzj.design.demo.responsibilityDesign;/*** 直接主管*/
public class DirectLeaderHandler extends AbstractLeaveHandler{@Overridepublic Integer getLimitDays() {//直接主管 只能审批 1 天内的请假return 1;}@Overridepublic String getApproveName() {return "直接主管-白毛女";}
}
4.部门经理处理类:DepartmentManagerHandler
部门经理处理类,继承抽象类 AbstractLeaveHandler,实现他的方法去自定义 可以处理天数LimitDays 7天及审批人名字
package com.jzj.design.demo.responsibilityDesign;/*** 部门经理*/
public class DepartmentManagerHandler extends AbstractLeaveHandler{@Overridepublic Integer getLimitDays() {//部门经理 只能审批 7 天内的请假return 7;}@Overridepublic String getApproveName() {return "部门经理-杨白劳";}}
5.总经理处理类: CompanyManagerHandler
公司总经理处理类,继承抽象类 AbstractLeaveHandler,实现他的方法去自定义 可以处理天数LimitDays 30天及审批人名字
package com.jzj.design.demo.responsibilityDesign;/*** 公司总经理*/
public class CompanyManagerHandler extends AbstractLeaveHandler{@Overridepublic Integer getLimitDays() {//公司总经理 只能审批 30 天内的请假return 30;}@Overridepublic String getApproveName() {return "公司总经理-黄世仁";}
}
结果
我们设置调用链 directManager直接主管-next-> departMentManager 部门经理-next-> companyManager 公司总经理
- directManagerHandler.setNextHandler(departMentManager);
- departMentManager.setNextHandler(companyManager);
package com.jzj.design.demo.responsibilityDesign;public class LeaveMain {public static void main(String[] args) {AbstractLeaveHandler directManagerHandler = new DirectLeaderHandler();AbstractLeaveHandler departMentManager = new DepartmentManagerHandler();AbstractLeaveHandler companyManager = new CompanyManagerHandler();directManagerHandler.setNextHandler(departMentManager);departMentManager.setNextHandler(companyManager);LeaveRequest leaveRequest1 = new LeaveRequest("1", "a", 1);directManagerHandler.handlerLeaveRequest(leaveRequest1);System.out.println("==============================================================");LeaveRequest leaveRequest5 = new LeaveRequest("5", "b", 5);directManagerHandler.handlerLeaveRequest(leaveRequest5);System.out.println("==============================================================");LeaveRequest leaveRequest20 = new LeaveRequest("20", "c", 20);directManagerHandler.handlerLeaveRequest(leaveRequest20);System.out.println("==============================================================");LeaveRequest leaveRequest40 = new LeaveRequest("40", "d", 40);directManagerHandler.handlerLeaveRequest(leaveRequest40);}
}
可以看到结果
1天的请假、直接主管直接审批
5 天的请假、部门经理审批
20天的请假、公司总经理审批
40天的请假、没有人审批通过
设计模式(三)- 责任链模式相关推荐
- 轻松学习Java设计模式之责任链模式
我们的态度是:每天进步一点点,理想终会被实现. 前言 设计模式,可能很多人都是看到代码知道怎么回事,但是离开代码再让其说出来,估计就有点含糊其词了,包括我自己在内.Android中其实用到的设计模式也 ...
- 手撸设计模式之-责任链模式
手撸设计模式之-责任链模式 一 .责任链模式介绍 1.1 定义 1.2 责任链模式UML结构图 1.3 责任链模式结构详细 1.3 用例代码实现 二.责任链模式应用场景: 2.1 场景概述 2.2 场 ...
- 走穿java23种设计模式-15责任链模式详解
走穿java23种设计模式-15责任链模式详解 责任链模式是一种常见的行为模式. 一.责任链模式的现实场景 习伟过生日邀请了很多朋友到KTV一起庆祝,为了增加欢乐的气氛,习伟建议大家一起玩击鼓传花的游 ...
- 软件设计模式之责任链模式实验
软件设计模式之责任链模式实验 一.实验目的 掌握软件责任链模式中的命令模式,能够用责任链模式编写程序,解决实际问题. 二.实验内容与要求 内容:某小学老师指定班里的三位学生收寒假作业,三位学生分别负责 ...
- Java设计模式之责任链模式(二)
所有设计模式传送门 本文将一起介绍学习下设计模式之责任链模式.责任链模式是指使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有 ...
- 乐在其中设计模式(C#) - 责任链模式(Chain of Responsibility Pattern)
原文:乐在其中设计模式(C#) - 责任链模式(Chain of Responsibility Pattern) [索引页] [源码下载] 乐在其中设计模式(C#) - 责任链模式(Chain of ...
- php设计模式之责任链模式
php设计模式之责任链模式 实际问题 你的论坛有举报功能,版主能解决粗口方面的举报,警察能解决严重一点的黄赌毒方面的举报,更严重的反政府的举报就需要由国安局来完成. 职场中每个人都有直属的上级,如果到 ...
- Java设计模式作业-责任链模式
Java设计模式作业-责任链模式:Web过滤器 文章目录 前言 一.类图 二.代码及测试结果 1.Trouble类 2.Support类 3.CharSupport类 4.TypeTransformS ...
- Java设计模式系列--责任链模式(应用)
原文网址:Java设计模式系列--责任链模式(应用)_IT利刃出鞘的博客-CSDN博客 简介 说明 本文介绍Java设计模式中的责任链模式的一些使用场景. 责任链模式的好处 符合单一职责原则 每个功能 ...
- JAVA设计模式之责任链模式(职责链模式)
转自JAVA设计模式之责任链模式(职责链模式) 责任链/职责链(Chain of Responsibility)模式的定义 为了避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理 ...
最新文章
- mysql实现gb18030转utf8_将编码是GB18030的小文件转为UTF8
- python读取文件读不出来-python文件读取失败怎么处理
- JDK JRE 的作用与区别【转】
- X264码率控制流程分析 (转)
- Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列目录
- 9008刷机模式写入超时刷机帮_刷机时没有成功,然后变成黑砖,usb接口直接变成未知设备~希望大神救助!...
- c语言中用于获取字符串长度的函数是,C语言中求字符串长度的函数的几种实现方法...
- [BZOJ2440][中山市选2011]完全平方数(莫比乌斯函数,二分)
- linux中iptables乱码,xshell连接CentOS6.5 iptables或ls 输出乱码-Go语言中文社区
- 逐行分析jQuery源码
- python你实现视频自动打码,了解妨碍你观看精彩的马赛克是怎么精准形成的
- 17岁韩寒在CCTV《对话》舌战群吊的视频
- 'MPD' object has no attribute 'myIP'
- 自动微分(Auto differentiation)
- WideDeep Model、Wide Model(LR)、Deep Model、DeepFm Model、NFM Model复现笔记
- 3D打印美容设备MagicBox
- 【数字图像处理】六.MFC空间几何变换之图像平移、镜像、旋转、缩放详解
- 企业网站关键词优化的步骤
- 数字图像处理——人脸识别
- xp系统访问共享服务器提示无网络路径,WinXP提示无任何网络提供程序接受指定的网络路径怎么办?...
热门文章
- 开一个羽毛球馆有哪些支出?
- MATLAB反三角函数arcsecx, arccscx, arctanx, arccotx, arcsinx, arccosx绘图表示
- 学计算机的辛苦困难,没有基础的人学计算机会遇到哪些困难?
- java中string中转义_如何在String.Format中转义%?
- Win10 21H2 19044+vs2019 WDK驱动开发,错误 MSB8040缓解Spectre 漏洞的库以及输出SXS.DLL的垃圾信息
- 关于导数意义的新认知
- Excel 设置下拉框-显示中文而实际数字
- 形式逻辑(05)假言判断 和 推理
- 证监会计算机类笔试上岸经验,2019国考证监会想妥妥上岸? 这6大考情你必须知晓...
- win7系统设备管理器打开后一片空白怎么办