【流程流转解耦设计模式】责任链模式

news/2025/3/14 14:25:29/文章来源:https://www.cnblogs.com/sun-10387834/p/18772009

责任链模式保姆级教程:基于Spring Boot的代码示例

1. 什么是责任链模式?

责任链模式(Chain of Responsibility Pattern)是一种行为设计模式,它允许多个对象有机会处理请求,从而避免请求的发送者与接收者之间的耦合。责任链模式将这些对象连成一条链,并沿着这条链传递请求,直到有对象处理它为止。

1.1 责任链模式的核心思想

  • 解耦:将请求的发送者和处理者解耦,使得多个对象都有机会处理请求。
  • 灵活性:可以动态地调整链中的处理者,增加或删除处理者。
  • 责任分离:每个处理者只关心自己能否处理请求,如果不能处理,则将请求传递给下一个处理者。

1.2 责任链模式的应用场景

  • 多级审批流程:例如请假审批、报销审批等。
  • 过滤器链:例如Web应用中的过滤器链、拦截器等。
  • 日志处理:不同级别的日志由不同的处理器处理。

2. 责任链模式的实现

2.1 责任链模式的结构

责任链模式通常包含以下几个角色:

  • Handler(抽象处理者):定义一个处理请求的接口,通常包含一个指向下一个处理者的引用。
  • ConcreteHandler(具体处理者):实现处理请求的具体逻辑,如果自己不能处理,则将请求传递给下一个处理者。
  • Client(客户端):创建责任链,并向链中的第一个处理者发送请求。

2.2 基于Spring Boot的责任链模式实现

下面我们通过一个简单的例子来演示如何在Spring Boot中实现责任链模式。假设我们有一个请假审批系统,请假请求需要经过多个层级的审批:组长、经理、总监。

2.2.1 创建抽象处理者

首先,我们定义一个抽象处理者 LeaveHandler,它包含一个指向下一个处理者的引用。

public abstract class LeaveHandler {protected LeaveHandler nextHandler;public void setNextHandler(LeaveHandler nextHandler) {this.nextHandler = nextHandler;}public abstract void handleRequest(LeaveRequest request);
}

2.2.2 创建具体处理者

接下来,我们创建三个具体处理者:GroupLeaderHandlerManagerHandlerDirectorHandler

@Component
public class GroupLeaderHandler extends LeaveHandler {@Overridepublic void handleRequest(LeaveRequest request) {if (request.getDays() <= 1) {System.out.println("组长批准了 " + request.getDays() + " 天的请假申请。");} else if (nextHandler != null) {nextHandler.handleRequest(request);}}
}@Component
public class ManagerHandler extends LeaveHandler {@Overridepublic void handleRequest(LeaveRequest request) {if (request.getDays() > 1 && request.getDays() <= 3) {System.out.println("经理批准了 " + request.getDays() + " 天的请假申请。");} else if (nextHandler != null) {nextHandler.handleRequest(request);}}
}@Component
public class DirectorHandler extends LeaveHandler {@Overridepublic void handleRequest(LeaveRequest request) {if (request.getDays() > 3) {System.out.println("总监批准了 " + request.getDays() + " 天的请假申请。");} else if (nextHandler != null) {nextHandler.handleRequest(request);}}
}

2.2.3 创建请假请求类

我们还需要一个 LeaveRequest 类来表示请假请求。

public class LeaveRequest {private int days;public LeaveRequest(int days) {this.days = days;}public int getDays() {return days;}
}

2.2.4 配置责任链

在Spring Boot中,我们可以通过配置类来组装责任链。

@Configuration
public class LeaveHandlerConfig {@Autowiredprivate GroupLeaderHandler groupLeaderHandler;@Autowiredprivate ManagerHandler managerHandler;@Autowiredprivate DirectorHandler directorHandler;@Beanpublic LeaveHandler leaveHandlerChain() {groupLeaderHandler.setNextHandler(managerHandler);managerHandler.setNextHandler(directorHandler);return groupLeaderHandler;}
}

2.2.5 使用责任链处理请求

最后,我们可以在服务类中使用责任链来处理请假请求。

@Service
public class LeaveService {@Autowiredprivate LeaveHandler leaveHandlerChain;public void submitLeaveRequest(LeaveRequest request) {leaveHandlerChain.handleRequest(request);}
}

2.2.6 测试责任链

我们可以编写一个简单的测试类来测试责任链的工作情况。

@SpringBootApplication
public class ChainOfResponsibilityApplication implements CommandLineRunner {@Autowiredprivate LeaveService leaveService;public static void main(String[] args) {SpringApplication.run(ChainOfResponsibilityApplication.class, args);}@Overridepublic void run(String... args) throws Exception {LeaveRequest request1 = new LeaveRequest(1);LeaveRequest request2 = new LeaveRequest(2);LeaveRequest request3 = new LeaveRequest(4);leaveService.submitLeaveRequest(request1);leaveService.submitLeaveRequest(request2);leaveService.submitLeaveRequest(request3);}
}

运行程序后,输出结果如下:

组长批准了 1 天的请假申请。
经理批准了 2 天的请假申请。
总监批准了 4 天的请假申请。

3. 责任链模式的优缺点

3.1 优点

  • 解耦:请求的发送者和处理者之间没有直接的依赖关系,降低了系统的耦合度。
  • 灵活性:可以动态地增加或修改处理链,符合开闭原则。
  • 责任分离:每个处理者只负责处理自己能处理的请求,职责清晰。

3.2 缺点

  • 性能问题:如果责任链过长,可能会导致请求处理速度变慢。
  • 调试困难:由于请求在链中传递,调试时可能难以跟踪请求的处理过程。

4. 总结

责任链模式是一种非常实用的设计模式,特别适用于需要多级处理的场景。通过责任链模式,我们可以将复杂的处理逻辑分解到多个处理者中,使得系统更加灵活和可扩展。在Spring Boot中,我们可以通过依赖注入和配置类来轻松实现责任链模式。

希望这篇博客能帮助你更好地理解责任链模式,并在实际项目中灵活运用。如果你有任何问题或建议,欢迎在评论区留言!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/898655.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SHP转WKT文件工具

SHP转WKT文件工具 *.shp转成wkt文件工具:将shp数据的图形转换成wkt工具 参数配置:param.yml设置shape路径,路径参数设置:shapeFile: “你的路径”;注:路径请使用"\\"或者’/’ ;避免使用含中文的路径示例: shapeFile: “C:/Users/Administrator/Desktop/wm/wm.s…

美标插头:插片一大一小,上面带孔

过年期间我遇到了一个刚从美国留学回来的朋友,正好在家无聊,我就让她给我讲讲在美国发生的事情,她告诉我去美国一定要带转换插座,因为那边的插头和国内的不一样,插头上的插片一大一小,可以说是很畸形了,可这是为什么呢?她说她刚开始也不懂,后来查了资料才知道,这是因…

MATLAB R2024b 安装教程

MATLAB R2024b 安装教程 软件介绍 MATLAB 是由 “Matrix” 和 “Laboratory” 两个词组合而成,意为“矩阵工厂”,是一款专注于科学计算、数据可视化和交互式程序设计的高科技计算环境。MATLAB 集成了数值分析、矩阵计算、科学数据可视化以及非线性动态系统建模和仿真等强大功…

手把手教如何将若依前后端分离项目在Tomcat下部署教程

如果你想在Tomcat单独部署诺依项目,前提你要配置好诺依相关的环境,比如安装jdk,mysql,redis,maven等环境,并且开发工具能够正常把项目跑起来,部署可自行去诺依官网查看相关教程。 接下来将详细讲解诺依项目部署在Tomcat下运行相关操作:后端部署1.打开开发工具,修改配置与打…

ASE40N25-ASEMI电动工具专用ASE40N25

ASE40N25-ASEMI电动工具专用ASE40N25编辑:ll ASE40N25-ASEMI电动工具专用ASE40N25 型号:ASE40N25 品牌:ASEMI 封装:TO-247 批号:最新 最大漏源电流:40A 漏源击穿电压:250V RDS(ON)Max:70mΩ 引脚数量:3 沟道类型:N沟道MOS管、中低压MOS管 漏电流:ua 特性:N沟道MO…

使用echarts创建一个进度条,怎么设置流光效果

使用echarts创建一个进度条,怎么设置流光效果1.引言: 相信大家做大屏都会用到echarts,但是我们是否能把他做些动画效果呢? 那么今天就来介绍一个bar进度条的流光效果。 2.制作过程: 首先:第一步我们先来制作一个进度条:option = {xAxis: {show: false,max: 1,},yAxis: {…

【快速判断是否存在利器】布隆过滤器和布谷鸟过滤器

从入门到精通:布隆过滤器和布谷鸟过滤器 在计算机科学领域,过滤器(Filter)是一种用于快速判断元素是否属于某个集合的数据结构。布隆过滤器(Bloom Filter)和布谷鸟过滤器(Cuckoo Filter)是两种常用的概率型过滤器,它们以高效的空间利用率和查询速度著称,广泛应用于缓…

分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!

前言 今天大姚给大家分享 3 个 .NET 开源、免费的文件压缩处理库,希望可以快速帮助同学们实现文件压缩和解压功能! SharpCompress SharpCompress 是一个基于 C# 编写的压缩库,支持多种压缩格式的解压与部分格式的写入,专为.NET多版本设计,适合处理大文件和流式压缩。适用于…

4S店如何做好线索管理?900条线索硬刚11台成交的底层逻辑

什么是4S店的线索管理?4S店线索管理怎么做?这篇来聊聊4S店怎么管好销售线索,希望对大家有所帮助。 线索管理,说白了就是别让客户信息浪费掉,把每个潜在客户的价值榨干。但现实是,很多店要么被无效线索淹没,要么跟进不到位,最后成交率低得可怜。 所以这篇我结合行业经验…

69.9K star!这个API调试神器让你告别Postman,开源免费真香!

Hoppscotch是一款专为开发者打造的轻量级API调试工具,凭借其极简的界面设计和强大的功能支持,已成为GitHub上最受欢迎的API开发工具之一。无需安装客户端,打开浏览器即可享受媲美Postman的专业体验!嗨,大家好,我是小华同学,关注我们获得“最新、最全、最优质”开源项目和…

古生物学家与人工智能的较量

古生物学家与人工智能的较量 捍卫史前真相:人工智能如何威胁古生物学的艺术与准确性 亚历杭德罗伊斯基尔多洛佩兹,博士由Mistral Le Chat创作的人工智能恐龙。有许多错误,但最明显的就是额外的一条腿。五条腿的恐龙有人要吗? 曾经,我问过ChatGPT:人工智能取代古生物学家的…

【日记】这两天收了好多好多快递!(896 字)

正文剩下的化妆品都到了。照片打印机也到了。其实在看到 into you 这个品牌的时候,我第一反应直接直译为 “进入你”。事实证明我还是太色了,笑死。看了一下它的翻译,“心慕与你”。颇有文学作品那种乱翻译的味道(笑。此外还发现它的写法有很多种,有时候把 in 和 to 分开,…