责任链模式的定义

​ 首先我们可以先看一下责任链模式的定义:

​ Avoid coupling the sender of a request to its receiver by giving more than one object a chance to handle the request.Chain the receiving objects and pass the request along the chain until an object handles it.(使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。)

责任链模式的通用类图(觉得不好理解的可以跳过往下看)

​ 下面我们再看一下责任链模式定义的通用的类图是什么样子的,这里我是参考的《设计模式之禅》中描述的类图,看着是不是非常的简单啊。

​ 这里说明一下,上面所说的Client肯定就是责任链路的调用方了,也就是request请求的发起方;Handler是个抽象的请求处理者,它的内部存在一个handlerRequest()的抽象方法,里面的内容是处理请求的详细业务逻辑。下面的ConcreteHandler是处理者的其中一个实现类,它会实现详细的处理逻辑,不过我觉得这里应该再多加几个实现类更好理解一些。

​ 那么如何以链路的形式存在呢,这里就是Handler这个抽象类中定义一个Handler的局部变量,并且提供一个next()方法进行赋值,这里注意一下上面的类图并没有详细的写出来,所以看着可能有点儿不好理解,下面给一下代码示例就好理解了。

Handler抽象类实现代码如下:

public abstract class Handler {private Handler nextHandler;//每个处理者都必须对请求做出处理public final Response handleMessage(Request request) {Response response = null; //判断是否是自己的处理级别if (this.getHandlerLevel().equals(request.getRequestLevel())) {response = this.echo(request);} else {// 不属于自己的处理级别,判断是否有下一个处理者if (this.nextHandler != null) {response = this.nextHandler.handleMessage(request);} else {//没有适当的处理者,业务自行处理}}return response;}//设置下一个处理者是public void setNext(Handler _handler) {this.nextHandler = _handler;}//每个处理者都有一个处理级别 每个处理者都必须实现处理任务protected abstract Level getHandlerLevel();protected abstract Response echo(Request request);
}

请假流程逻辑说明

假设让我们实现一个请假流程的功能,请假的业务规则如下所示:

一个员工进行请假的话,如果是1天以内(包含一天),直接小组长进行审批就可以了。如果是大于1天小于3天,流程继续向下走,需要部门经理进行批准,如果请假天数超过3天以上CTO审批。

这个流程还是非常好理解的,就是一个链式的流程结构,如果符合某些规则就会请求继续往下一个节点执行。

责任链模式实现请假流程处理流程图

实现请假流程操作的流程图如上图所示,Approvehandler是抽象的审批流程处理者,doHandler(int)方法是对请假天数(传参就是请假天数,方便理解,尽量方法简单)的一个逻辑处理方法;next方法是用来作为传入下一个节点的对象,我们可以参考一下链表的Node对象就明白了,里面变量也有next、pro类型都是Node类型的!

下面的Handler的实现类GroupLeaderApproveHandler、DepartLeaderApproveHandler、CTOApproveHandler相对来说好理解一些,直接实现自己的处理的逻辑就可以了。

然后就是我们的调用方的使用EmployeeClient,我们只需要创建好请假方法,在里面初始化好对应的处理者节点,然后调用doHandler方法就可以了。

责任链模式请假流程代码实现

idea中代码设计的diagram类图如下所示:

ApproveHandler.java

/*** @author gengcc* @version 1.0* @ClassName ApproveHandler* @description 抽象的审批处理器* @date 2021/9/29 10:48*/
public abstract class ApproveHandler {protected ApproveHandler next;/*** 指定下一个处理者** @param approveHandler* @author gengcc* @date 2021/9/29 10:51*/public void next(ApproveHandler approveHandler) {this.next = approveHandler;}/*** 处理审批请假天数** @param size* @author gengcc* @date 2021/9/29 10:54*/public abstract void doHandler(int size);
}

GroupLeaderApproveHandler.java

/*** @author gengcc* @version 1.0* @ClassName LeaderApproveHandler* @description* @date 2021/9/29 10:53*/
public class GroupLeaderApproveHandler extends ApproveHandler {@Overridepublic void doHandler(int size) {System.out.println("group leader 审批通过!");if (size <= 1) {return;}next.doHandler(size);}
}

DepartLeaderApproveHandler.java

/*** @author gengcc* @version 1.0* @ClassName LeaderApproveHandler* @description* @date 2021/9/29 10:53*/
public class DepartLeaderApproveHandler extends ApproveHandler {@Overridepublic void doHandler(int size) {System.out.println("depart leader 审批通过!");if (size <= 3) {return;}next.doHandler(size);}
}

CTOApproveHandler.java

/*** @author gengcc* @version 1.0* @ClassName CTOApproveHandler* @description* @date 2021/9/29 10:57*/
public class CTOApproveHandler extends ApproveHandler {@Overridepublic void doHandler(int size) {if (size > 3) {System.out.println("cto 审批通过!");}return;}
}

EmployeeClient.java

/*** @author gengcc* @version 1.0* @ClassName ApproveMain* @description* @date 2021/9/29 11:00*/
public class EmployeeClient {/*** 模拟请假请求* @author gengcc* @date  2021/10/12 11:38*/public static void main(String[] args) {// 设置请假添加int size = 5;// 处理器初始化ApproveHandler groupLeaderHandler = new GroupLeaderApproveHandler();ApproveHandler departLeaderHandler = new DepartLeaderApproveHandler();ApproveHandler ctoHandler = new CTOApproveHandler();groupLeaderHandler.next(departLeaderHandler);departLeaderHandler.next(ctoHandler);// 请假者只需要向组长发起审批请求就可以了groupLeaderHandler.doHandler(size);}
}

总结

​ 其实这里给出的请假流程只是方便我们去理解责任链模式的一个使用,等我们了解了什么是责任链模式,下面我们就可以进行工作中的一些实战,实际上我们工作中对于责任链模式的使用有个场景非常合适,就是ETL过程中的中间环节Transformation也就是数据转换或者说是数据处理,这个数据处理的过程有数据清洗、提取、标识、关联等操作环节,而且特点是顺序不是固定的,而是允许我们任意组装,这种场景是非常适合使用责任链模式的,当然中间还夹杂着其他设计模式的使用。

设计模式-请假流程-责任链模式相关推荐

  1. 简易理解设计模式之:责任链模式——OA中请假流程示例

    介绍: 责任链模式属于行为型设计模式.它的定义为:使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,只到有对象处理它为止. 类图: ...

  2. 《JAVA设计模式系列》责任链模式

    文章目录 责任链模式 责任链模式优缺点 应用场景 责任链模式的结构 实现流程 责任链模式 责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链.这 ...

  3. 【手写源码-设计模式15】-责任链模式-基于人事请假单工作流场景

    1:主题拆解 ①基本介绍 ②人事请假单工作流模拟 ③责任链模式的优缺点 ④适用场景 ⑤应用实例 ⑥ASP.NET 管道模型 2:基本介绍 责任链模式很像异常的捕获和处理,当一个问题发生的时候,当前对象 ...

  4. java责任链模式审批请假_14-学生生病请假:责任链模式

    14.1 请假流程 学生生病了,需要请假,写了请假条交给班长处理.假如此时有三种情况: 1)是小病需要请假时间短,班长能够处理,就批准请假,否则交给老师处理: 2)老师实际查看学生的情况,如果可以处理 ...

  5. 《java设计模式》之责任链模式

    在阎宏博士的<JAVA与模式>一书中开头是这样描述责任链(Chain of Responsibility)模式的: 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其 ...

  6. Java描述设计模式(15):责任链模式

    本文源码:GitHub·点这里 || GitEE·点这里 一.生活场景描述 1.请假审批流程 公司常见的请假审批流程:请假天数 当 day<=3 天,项目经理审批 当 3<day<= ...

  7. 采购申请的处理流程 --- 责任链模式

    前情提要 上集讲到小光梳理了公司的组织架构, 利用组合模式建立起了一个可扩展变化的多层的组织架构体系. 更清晰地明确了公司各个层级, 各个部门的职责. 大家明确职责, 通力合作, 让"小光热 ...

  8. [设计模式] javascript 之 责任链模式

    责任链模式:定义 责任链接模式又称职责链模式,是一种对象的行为模式:它是一种链式结构,每个节点都有可能两种操作,要么处理该请求停止该请求操作,要么把请求转发到下一个节点,让下一个节点来处理请求:该模式 ...

  9. 设计模式探索之责任链模式

    责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链.这种模式给予请求的类型,对请求的发送者和接收者进行解耦.这种类型的设计模式属于行为型模式. ...

最新文章

  1. java jsp 文件上传_用JSP编写文件上传
  2. 【Java 泛型】泛型用法 ( 泛型编译期擦除 | 上界通配符 <? extends T> | 下界通配符 <? super T> )
  3. SQL Server强制使用特定索引 、并行度、锁
  4. mysql 排序字段是否需要建索引_MySQL索引详解(优缺点,何时需要/不需要创建索引,索引及sql语句的优化)...
  5. 完成端口(IOCP)详解[1/2](转载)
  6. 变分模态分解(VMD)原理-附代码
  7. 用AVX2指令集优化浮点数组求和
  8. MySQL-数据库基础
  9. VS绿豆沙屏幕保护色参数设置
  10. 以HT82K629B为主控的程序员专用CV键盘(无需代码烧写)
  11. mac 下 python 批量删除 PDF 中的某些页面
  12. markdownpad2使用
  13. Linux下Java剪贴板的访问
  14. 选对平台 ... 选对平台... 选对平台 ...
  15. idea好用的json格式化预览插件
  16. 框架 day74 涛涛商城项目整合ssm,分页插件pagehelper,商品列表查询
  17. 建筑与建筑群综合布线系统工程施工及验收规范
  18. pcl::lineToLineSegment() 计算空间直线的交点和最小公垂线
  19. 不卸载升级cmake
  20. Python-图片格式转化(jip,png,jieg转化为PDF,PDF转jip,png,jieg)

热门文章

  1. 定时器 java qua_【spring-boot】 springboot整合quartz实现定时任务
  2. 移动端点击a标签后默认蓝色背景如何去除
  3. 机器学习--K近邻算法(KNN)(2)
  4. 单像素成像图像智能处理算法
  5. Objective C 常用代码片段制作(code snippet library)
  6. 树莓派4B安装官方64位桌面系统
  7. Python库之数据可视化---Matplotlib
  8. 听说写面经能赞RP·······
  9. 鲲鹏devkit(迁移 测试 性能分析) boostkit
  10. linux命令返回结果保存到文件,Linux终端运行命令及结果同时保存入文件方法总结...