登录
/
注册
首页
论坛
其它
首页
科技
业界
安全
程序
广播
Follow
关于
导读
排行榜
资讯
发帖说明
登录
/
注册
账号
自动登录
找回密码
密码
登录
立即注册
搜索
搜索
关闭
CSDN热搜
程序园
精品问答
技术交流
资源下载
本版
帖子
用户
软件
问答
教程
代码
写记录
写博客
小组
VIP申请
VIP网盘
网盘
联系我们
发帖说明
道具
勋章
任务
淘帖
动态
分享
留言板
导读
设置
我的收藏
退出
腾讯QQ
微信登录
返回列表
首页
›
业界区
›
安全
›
【流程流转解耦设计模式】责任链模式
【流程流转解耦设计模式】责任链模式
[ 复制链接 ]
兑谓
2025-6-1 20:54:54
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
责任链模式保姆级教程:基于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 创建具体处理者
接下来,我们创建三个具体处理者:GroupLeaderHandler、ManagerHandler 和 DirectorHandler。
@Component
public class GroupLeaderHandler extends LeaveHandler {
@Override
public 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 {
@Override
public 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 {
@Override
public 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 {
@Autowired
private GroupLeaderHandler groupLeaderHandler;
@Autowired
private ManagerHandler managerHandler;
@Autowired
private DirectorHandler directorHandler;
@Bean
public LeaveHandler leaveHandlerChain() {
groupLeaderHandler.setNextHandler(managerHandler);
managerHandler.setNextHandler(directorHandler);
return groupLeaderHandler;
}
}
复制代码
2.2.5 使用责任链处理请求
最后,我们可以在服务类中使用责任链来处理请假请求。
@Service
public class LeaveService {
@Autowired
private LeaveHandler leaveHandlerChain;
public void submitLeaveRequest(LeaveRequest request) {
leaveHandlerChain.handleRequest(request);
}
}
复制代码
2.2.6 测试责任链
我们可以编写一个简单的测试类来测试责任链的工作情况。
@SpringBootApplication
public class ChainOfResponsibilityApplication implements CommandLineRunner {
@Autowired
private LeaveService leaveService;
public static void main(String[] args) {
SpringApplication.run(ChainOfResponsibilityApplication.class, args);
}
@Override
public 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中,我们可以通过依赖注入和配置类来轻松实现责任链模式。
希望这篇博客能帮助你更好地理解责任链模式,并在实际项目中灵活运用。如果你有任何问题或建议,欢迎在评论区留言!
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
流程
流转
解耦
设计模式
责任
相关帖子
JavaSE----- 流程控制
Spring Security 认证流程闭环与调用链路详解
全流程自动化与成本结构优化——睿标AI的降本增效实践
全流程自动化与成本结构优化——睿标AI的降本增效实践
Spring Security 鉴权流程与过滤器链深度剖析
Spring Security 鉴权流程与过滤器链深度剖析
Miniconda 安装与环境配置全流程图解(2025 最新版)
rllm中的推理流程
vue-dawn-flow 低代码流程插件
Python 程序的流程控制
回复
使用道具
举报
提升卡
置顶卡
沉默卡
喧嚣卡
变色卡
千斤顶
照妖镜
相关推荐
业界
JavaSE----- 流程控制
1
689
撷监芝
2025-11-20
业界
Spring Security 认证流程闭环与调用链路详解
2
342
轮达
2025-11-25
业界
全流程自动化与成本结构优化——睿标AI的降本增效实践
0
212
乐敬
2025-11-26
业界
全流程自动化与成本结构优化——睿标AI的降本增效实践
1
667
烯八
2025-11-26
业界
Spring Security 鉴权流程与过滤器链深度剖析
5
916
叟澡帅
2025-11-26
业界
Spring Security 鉴权流程与过滤器链深度剖析
1
164
佴莘莘
2025-11-26
安全
Miniconda 安装与环境配置全流程图解(2025 最新版)
1
37
章绮云
2025-11-30
业界
rllm中的推理流程
1
150
轨项尺
2025-12-02
业界
vue-dawn-flow 低代码流程插件
3
573
精滂软
2025-12-09
安全
Python 程序的流程控制
1
944
明思义
2025-12-11
回复
(4)
榷另辑
2025-11-29 04:41:26
回复
使用道具
举报
照妖镜
程序园永久vip申请,500美金$,无限下载程序园所有程序/软件/数据/等
感谢,下载保存了
丰江
2025-12-1 04:49:41
回复
使用道具
举报
照妖镜
程序园永久vip申请,500美金$,无限下载程序园所有程序/软件/数据/等
感谢发布原创作品,程序园因你更精彩
哈妙思
5 天前
回复
使用道具
举报
照妖镜
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
分享、互助 让互联网精神温暖你我
衣旱
3 天前
回复
使用道具
举报
照妖镜
程序园永久vip申请,500美金$,无限下载程序园所有程序/软件/数据/等
热心回复!
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
回复
本版积分规则
回帖并转播
回帖后跳转到最后一页
浏览过的版块
业界
签约作者
程序园优秀签约作者
发帖
兑谓
3 天前
关注
0
粉丝关注
21
主题发布
板块介绍填写区域,请于后台编辑
财富榜{圆}
3934307807
991124
anyue1937
9994893
kk14977
6845358
4
xiangqian
638210
5
韶又彤
9997
6
宋子
9982
7
闰咄阅
9993
8
刎唇
9993
9
俞瑛瑶
9998
10
蓬森莉
9951
查看更多
今日好文热榜
547
JSAPIThree 加载单体三维模型学习笔记:Sim
118
读捍卫隐私09匿名指南
68
工作中常用函数详解与示例-PostgreSQL(其他
585
很顶!零成本克隆你的声音,这款B站开源神
674
go语言/golang 自动升级配置
961
函数式编程与传统编程的对比——基于java
228
pgAdmin 后台命令执行漏洞复现及分析(CVE-
856
度假村亲子水上乐园设备哪家质量好?
282
上下文协议(MCP)Java SDK 指南
696
Mac办公效率翻倍?Charmstone教你玩转多任
774
深耕上海14年,专业防水补漏:如何为厂房、
826
【A】字符串
461
一个完全由大模型AI Coding开发而成的程序
699
【Ubuntu】Ubuntu+VScode+ESP-IDF 的环境搭
664
60 秒出高质量科研图!Gemini+DeepSeek 绘
781
追踪链路--使用iptables/ipvs来记录后端pod
160
【译】初探 Visual Studio 2026 全新的用户
322
建筑渗漏治理的标准化实践:基于上海芮生建
54
Aspire 13:从.NET 编排工具到真正的多语言
997
用 .NET 最小化 API 构建高性能 API