设计模式——Chain(责任链)设计模式
摘要
责任链设计模式是一种行为设计模式,通过链式调用将请求逐一传递给一系列处理器,直到某个处理器处理了请求或所有处理器都未能处理。它解耦了请求的发送者和接收者,允许动态地将请求处理职责分配给多个对象,支持请求的灵活传递或中断。
1. 责任链设计模式是什么
1.1. 责任链设计模式
责任链模式理解就是遍历某一个接口下所有的实现类中方法。责任链模式的核心思想就是通过链式调用将请求逐一传递给一系列处理器(实现了同一个接口的对象),直到某个处理器处理了请求,或者链中的所有处理器都未能处理该请求。
1.2. 责任链模式的基本工作原理:
- 处理者链:将多个处理者(通常是实现了相同接口的类)链接在一起,每个处理者负责处理请求的一个特定方面。
- 请求传递:请求会沿着责任链传递,每个处理者都会判断是否能够处理该请求,处理后返回或继续传递给下一个处理者。
- 终止条件:如果某个处理者能够处理该请求,链条上后续的处理者通常会被跳过,直接返回处理结果;如果没有处理者能处理,最终请求可能会失败。
1.3. 简化的责任链模式结构
可以把责任链模式理解为:
- 链表结构:每个节点(处理器)持有对下一个节点的引用,依次处理请求。
- 处理器接口:每个节点实现一个接口,负责具体的处理逻辑。
责任链模式(Chain of Responsibility Pattern)与 装饰器模式(Decorator Pattern) 和 迭代器模式(Iterator Pattern) 在某些方面有相似之处,但它们的核心思想和使用场景略有不同。
| 特性 | 责任链模式 | 装饰器模式 |
| 目的 | 解耦请求的发送者和接收者,将请求交给多个处理者逐一处理 | 动态为对象添加功能,增强其行为 |
| 结构 | 请求按链式结构传递,每个处理者持有下一个处理者的引用 | 对原对象进行包装,增加额外功能 |
| 请求传递 | 请求沿着责任链传递,直到某个处理器处理请求或链终止 | 不传递请求,直接在原对象上增强功能 |
| 设计模式重点 | 请求处理的顺序和中断条件控制 | 通过包装原对象来动态增加功能 |
| 典型应用场景 | 多个处理器顺序处理请求,逐个判断并决定是否处理 | 动态为对象添加行为,功能扩展而不修改原对象代码 |
| 耦合性 | 请求发送者与接收者解耦,减少了依赖关系 | 可以灵活地为对象添加功能,扩展类的功能而不修改其代码 |
| 责任 | 每个处理者负责部分请求处理逻辑 | 每个装饰器负责对原对象的功能扩展 |
1.4. 责任链设计模式的作用
- 请求传递:每个处理者(链上的对象)都有一个引用指向下一个处理者。请求沿着链依次传递,直到被某个处理者处理或链结束。
- 解耦:发送方无需直接与处理方耦合,降低代码的复杂度。
- 可扩展性:可以灵活地添加、删除或修改链上的处理者,而不影响整体结构。
- 职责分离:每个处理者只关注自己能处理的部分,其余的请求传递给下一个处理者。
1.5. 责任链模式的优点
- 解耦请求与处理者:请求方不需要知道具体处理者是谁,降低耦合。
- 动态组合职责链:可以灵活地增加、删除或重排链中的处理节点。
- 代码清晰:将复杂的逻辑分解到多个处理节点中,职责单一。
1.6. 责任链模式的缺点
- 性能开销:当责任链过长时,可能带来性能问题。
- 调试困难:请求处理链条较长时,调试排查问题可能变得复杂。
- 不保证请求被处理:如果没有合适的处理者,可能导致请求最终未被处理。(执行链是有默认的顺序,可以借助Spring中@Order注解来实现有序)
2. 责任链模式类图实现

2.1. 责任链模式的结构
责任链模式主要包含以下角色:
- Handler(处理者抽象类/接口):
-
- 定义处理请求的接口,并存储下一个处理者的引用。
- ConcreteHandler(具体处理者):
-
- 继承或实现
Handler,处理它负责的请求。如果无法处理,则将请求转发给下一个处理者。
- 继承或实现
- Client(客户端):
-
- 创建责任链,并向链头发出请求。
3. 责任链模式使用场景
3.1. 多级请求处理
- 当一个请求需要经过多个对象处理,且不明确具体是由哪个对象处理时。
- 示例:
-
- 日志系统:根据日志级别(DEBUG、INFO、WARN、ERROR)动态决定由哪个日志处理器处理。
- 审批流:如贷款审批流程,依次经过组长、经理、总监的审批。
3.2. 请求处理职责动态变化
- 处理职责可能会随时增减,且希望能灵活调整处理顺序。
- 示例:风控规则引擎:新增或调整规则处理节点时,动态维护责任链。
3.3. 避免请求发送者与接收者耦合
- 当请求发送者不需要知道接收者的具体实现时,可以通过责任链解耦。
- 示例:支付系统:如多种支付渠道(银行卡、第三方支付、余额支付)按优先级尝试支付。
3.4. 请求的处理逻辑可以被分解
- 请求的处理逻辑非常复杂,且可以拆分成多个步骤时,每个步骤都可以成为责任链上的一个节点。
- 示例:HTTP 请求拦截器:如在请求到达服务器前,依次经过身份认证、权限验证、数据校验等。
3.5. 需要支持请求的灵活传递或中断
- 某个处理器完成后,可以继续传递给下一个处理器,也可以选择中止传递。
- 示例:事件处理机制:如 Java 的事件监听器,事件沿着监听器链依次传递,直到某个监听器处理完成。
3.6. 责任链具体场景示例
3.6.1. 风控规则链
在信贷风控中,每个用户的申请需要经过一系列的规则检查,例如:
- 身份证校验
- 黑名单检测
- 信用评分计算
- 额度限制校验
这些规则可以按顺序依次处理,或者某个规则失败时中断处理。
3.6.2. API 请求过滤
如在微服务架构中,API 请求经过以下责任链:
- 身份验证拦截器
- 参数校验拦截器
- 权限检查拦截器
- 日志记录拦截器
3.6.3. 异常处理链
多个异常处理器按顺序处理异常,例如:
- 数据库异常处理器
- 网络异常处理器
- 业务逻辑异常处理器
责任链可以逐级定位和处理异常。
3.6.4. 广告投放系统
- 按用户属性(年龄、性别、兴趣)动态匹配投放规则。
- 若某规则不适用,则传递给下一个规则。
4. 责任链模式示例(Spring)
在 Spring 中使用 责任链模式 并让链上的处理器由 Spring 容器管理,可以通过以下方式实现:利用 Spring 的 @Component 注解 配合 自动注入(@Autowired) 或者通过 @Order 注解 实现责任链的顺序化管理。
4.1. 定义责任链接口
public interface Handler {boolean handle(Request request);
}
每个校验规则实现该接口,handle 方法返回 true 代表校验通过,false 代表校验失败。
4.2. 定义请求对象
@Data
public class Request {private String userId;private int creditScore;private double loanAmount;// 其他字段...// Getter & Setter
}
4.3. 创建具体的处理器
每个处理器(节点)实现 Handler 接口,例如:
4.3.1. 身份校验处理器
@Component
public class IdentityValidationHandler implements Handler {@Overridepublic boolean handle(Request request) {// 假设用户 ID 不能为空if (request.getUserId() == null || request.getUserId().isEmpty()) {System.out.println("身份校验失败");return false;}System.out.println("身份校验通过");return true;}
}
4.3.2. 黑名单检测处理器
@Component
public class BlacklistCheckHandler implements Handler {@Overridepublic boolean handle(Request request) {// 假设用户 "123" 是黑名单用户if ("123".equals(request.getUserId())) {System.out.println("黑名单校验失败");return false;}System.out.println("黑名单校验通过");return true;}
}
4.3.3. 信用评分校验处理器
public class CreditScoreCheckHandler implements Handler {@Overridepublic boolean handle(Request request) {// 假设信用评分不能低于 600if (request.getCreditScore() < 600) {System.out.println("信用评分校验失败");return false;}System.out.println("信用评分校验通过");return true;}
}
4.3.4. 额度检查处理器
@Component
public class LoanAmountCheckHandler implements Handler {@Overridepublic boolean handle(Request request) {// 假设贷款金额不能超过 50 万if (request.getLoanAmount() > 500000) {System.out.println("额度检查失败");return false;}System.out.println("额度检查通过");return true;}
}
4.4. 责任链测试
package com.zhuangxiaoyan.hyxftest.chain;import com.zhuangxiaoyan.hyxftest.HyxfTestApplication;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;/*** chaintest** @author xjl* @version 2024/12/04 19:56**/@SpringBootTest(classes = HyxfTestApplication.class)
public class ChainTest {@Autowiredprivate HandlerChain handlerChain;@Testpublic void chainTest() {handlerChain.process(new Request("122222", 500, 10000));}
}
5. 博文参考
《软件设计模式》
相关文章:
设计模式——Chain(责任链)设计模式
摘要 责任链设计模式是一种行为设计模式,通过链式调用将请求逐一传递给一系列处理器,直到某个处理器处理了请求或所有处理器都未能处理。它解耦了请求的发送者和接收者,允许动态地将请求处理职责分配给多个对象,支持请求的灵活传…...
HarmonyOS(63) ArkUI 自定义占位组件NodeContainer
NodeContainer 1、前言2、NodeContainer和NodeController3、示例代码3.1、创建@Builder3.2、 创建NodeController3.3、 使用NodeCtroller4、NodeContainer的作用5、FrameNode简介6、BuilderNode简介7、参考资料1、前言 在HarmonyOS(62) ArkUI @Reusable组件复用原理讲了组件复…...
Python深度强化学习对冲策略:衍生品投资组合套期保值Black-Scholes、Heston模型分析...
全文链接:https://tecdat.cn/?p38463 本文提出了一个在存在交易成本、市场冲击、流动性约束或风险限制等市场摩擦的情况下,使用现代深度强化学习方法对衍生品投资组合进行套期保值的框架。我们讨论了标准强化学习方法如何应用于非线性奖励结构ÿ…...
【opencv入门教程】2. Point()类用法
文章选自: void Samples::PointFunc() {//输入二维点Point2f point2f(6, 2);cout << "【2维点】p " << point2f << ";\n" << endl;// 输入三维点Point3f point3f(8, 2, 0);cout << "【3维点】p3f "…...
前端导出excel实战(xlsx库和exceljs库)
一. 概览 前端导出excel是比较常见的需求,比如下载excel模板和批量导出excel。目前比较常用的库有xlsx和excel,接下来就着两种方式进行梳理。 二. 下载模板 xlsx库实现: 示例核心代码如下: const excelColumn {details: {ma…...
【附源码】基于环信鸿蒙IM SDK实现一个聊天Demo
项目背景 本项目基于环信IM 鸿蒙SDK 打造的鸿蒙IM Demo,完全适配HarmonyOS NEXT系统,实现了发送消息,添加好友等基础功能。代码开源,功能简洁,如果您有类似开发需求可以参考。 源码地址:https://github.c…...
Python库常用函数-数据分析
Python库常用函数 1.pandas库 (1)数据读取与写入 读取 CSV 文件: data pd.read_csv(file.csv)读取 Excel 文件: data pd.read_excel(file.xlsx, sheet_nameSheet1)写入 CSV 文件: data.to_csv(new_file.csv, ind…...
汽车EEA架构:架构的简介
1.架构的定义 汽车领域谈论的架构一词,来源于英文单词Architecture。在《系统架构:复杂系统的产品设计与开发》一书中对架构的定义如下:系统架构是一种概念的具象化,是物理或信息功能到形式元素的分配,是系统之内的元素之间的关系与周边环境…...
渗透测试--数据库攻击
这篇文章瘾小生其实想了很久,到底是放在何处,最终还是想着单拎出来总结,因为数据库攻击对我们而言非常重要,而且内容众多。本篇文章将讲述在各位获取数据库权限的情况下,各个数据库会被如何滥用,以及能够滥…...
反向路径转发(RPF)
本文介绍了反向路径转发(RPF)是如何在FortiGate上实现的。 它还解释了特定于VDOM的CLI设置“config system settings -> set strict-src-check”如何修改RPF行为。 测试场景中使用了以下设置 反向路径过滤器(又名RPF)是一种安…...
Python 正则表达式常用特殊字符及其含义
以下是 Python 正则表达式常用特殊字符及其含义 的全面整理,涵盖了常见和重要的正则符号,以及它们的示例,适合用来写博客或学习使用: Python 正则表达式常用特殊字符及其含义 1. . (点号) 含义:匹配除换行符 \n 以外…...
Uniapp Android SpringBoot3 对接支付宝支付(最新教程附源码)
Uniapp Android SpringBoot3 对接支付宝支付(最新教程附源码) 1、效果展示2、后端实现2.1 引入支付宝SDK依赖 pom.xml2.2 配置 application.yml2.3 支付宝相关代码2.3.1 AlipayConfig.java2.3.2 ZfbPayConfig.java2.3.3 支付接口2.3.4 支付回调处理接口&…...
SQL DML 语句
CREATE TABLE classes (ClassID varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 班级ID,ClassName varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 班级名称,TeacherID varchar(20) CHARACTER SET utf8mb4…...
饲料颗粒机全套设备有哪些机器组成
颗粒饲料机主要用于将各种饲料原料(如玉米、豆粕、麦麸、鱼粉等)进行混合、压制,制成颗粒状的饲料。这种饲料不仅方便储存和运输,还能提高动物的采食效率和饲料利用率。同时,颗粒饲料在加工过程中能灭部分微生物和寄生…...
MySQL事务与锁
定义一个事务向d_eams数据库的student表中插入3条记录,并检验若插入相同的学号,则回滚事务,既插入无效,否则成功提交 delimiter $$ create procedure tr_proc() begindeclare continue handler for sqlstate 23000beginrollback;…...
汽车免拆案例 | 2007款宝马650i车发动机偶尔无法起动
故障现象 一辆2007款宝马650i车,搭载N62B48B发动机,累计行驶里程约为26万km。车主反映,发动机偶尔无法起动,故障频率较低,十几天出现1 次,且故障出现时起动机不工作。 故障诊断 接车后试车,…...
PostgreSQL和Oracle的sql差异
PostgreSQL和Oracle的sql差异 1.rownum (1)Oracle分页查询使用rownum,PostgreSQL使用limit offset ORACLEPOSTGRESQLselect * from (select rownum r,e.* from emp e where rownum <5) t where r>0;select * from emp limit 5 offset…...
SpringMvc完整知识点二(完结)
SpringMVC获取请求参数 环境准备工作等均省略,可详见快速入门,此处只写非共有部分代码 该部分示例项目SpringMvcThree已上传至Gitee,可自行下载 客户端请求参数的格式为:namevalue&passwordvalue... ... 服务端想要获取请求…...
29 - Java Serializable 序列化
Java的Serializable接口是Java序列化机制的核心,它允许一个对象的状态被转换为字节流,从而可以方便地进行存储或传输。 序列化后的对象可以被写到数据库、存储到文件系统,或者通过网络传输。 要在 Java 中使一个类可序列化,你需要…...
59 基于STM32的烟雾、红外、温湿度检测
所有仿真详情导航: PROTEUS专栏说明-CSDN博客 目录 一、主要功能 二、硬件资源 三、主程序编程 四、资源下载 一、主要功能 基于SMT32F103C8T6单片机,采用DHT11检测温湿度,采用光敏电阻检测光照,采用滑动变阻器分别模拟红外、烟雾,通过OLED显示屏显示,如果湿度过低…...
从“高危论文”到“安心提交”:百考通双降技术,为真实思考护航
在一个人工智能可以生成万字论文的时代,最讽刺的现实不是机器冒充人类, 而是人类因写得太像“人写的论文”,被当作机器。 2026年,无数高校学子正陷入一场无声的困境: 你没用AI,却因逻辑清晰被标记…...
Linux文件系统架构与缓存机制解析
Linux文件系统架构与缓存机制深度解析1. 文件系统核心架构1.1 文件系统基本组织形式Linux文件系统采用分层结构设计,主要包含以下核心组件:块存储机制:硬盘被划分为固定大小的块(默认4KB),文件数据分散存储…...
WebGL BIM可视化:浏览器端BIM解决方案的技术实践与行业应用
WebGL BIM可视化:浏览器端BIM解决方案的技术实践与行业应用 【免费下载链接】xeokit-bim-viewer A browser-based BIM viewer, built on the xeokit SDK 项目地址: https://gitcode.com/gh_mirrors/xe/xeokit-bim-viewer 如何解决浏览器端BIM模型加载慢、操…...
根据您提供的写作范围,我为您总结的标题为:“昆通泰MCGS7.7嵌入版:6车位停车场监控系统仿...
6车位停车场监控系统昆通泰MCGS7.7嵌入版仿真运行带运行效果视频6车位停车场监控系统用昆通泰MCGS7.7嵌入版做仿真,真的是新手友好型项目——不用扛硬件、不用接复杂通讯,靠内部变量和几段脚本就能把核心逻辑跑通,还能直观看到实时效果&#…...
ConvNeXt 改进 :ConvNeXt添加SAConv(可切换空洞卷积),自适应融合多尺度特征,优化小目标与遮挡目标感知,二次创新CNBlock结构
本文教的是方法,也给出几种改进方法,二次创新结构,百变不离其宗,一文带你改进自己模型,科研路上少走弯路。 作者提出的技术结合了递归特征金字塔和可切换空洞卷积,通过强化多尺度特征学习和自适应的空洞卷积,显著提升了目标检测的效果。 理论介绍 空洞卷积(Atrous Co…...
brpc连接池动态调整算法:基于排队理论的设计与实现
brpc连接池动态调整算法:基于排队理论的设计与实现 【免费下载链接】brpc brpc is an Industrial-grade RPC framework using C Language, which is often used in high performance system such as Search, Storage, Machine learning, Advertisement, Recommendat…...
Qwen3.5-4B-Claude-Opus部署教程:模型路径软链失效时的容错加载机制
Qwen3.5-4B-Claude-Opus部署教程:模型路径软链失效时的容错加载机制 1. 模型概述 Qwen3.5-4B-Claude-4.6-Opus-Reasoning-Distilled-GGUF是基于Qwen3.5-4B的推理蒸馏模型,特别强化了结构化分析、分步骤回答以及代码与逻辑类问题的处理能力。该版本以GG…...
终极文档处理方案:AnythingLLM如何实现PDF/TXT/DOCX全格式智能解析
终极文档处理方案:AnythingLLM如何实现PDF/TXT/DOCX全格式智能解析 【免费下载链接】anything-llm 这是一个全栈应用程序,可以将任何文档、资源(如网址链接、音频、视频)或内容片段转换为上下文,以便任何大语言模型&am…...
如何高效使用抖音批量下载器:3分钟快速上手完整指南
如何高效使用抖音批量下载器:3分钟快速上手完整指南 【免费下载链接】douyin-downloader 项目地址: https://gitcode.com/GitHub_Trending/do/douyin-downloader 还在为手动保存抖音视频而烦恼吗?每次看到喜欢的合集都要一个个点击分享保存&…...
2026必看:八款热门AI编程工具横评
一、AI编程工具榜单综述当下AI技术全面渗透软件开发领域,各类AI编程工具大幅降低了开发门槛、提升了编码效率,成为开发者必备的效率神器。本次横评精选海内外8款主流产品,覆盖AI原生IDE、插件式编程助手等不同形态,全方位盘点各工…...
