常用设计模式:职责链模式

news/2025/11/15 16:38:32/文章来源:https://www.cnblogs.com/guangzan/p/19225743

根据 ChatGPT 的描述, 后端项目中出现频率最高的前 6 名设计模式是:

排名 模式 典型应用
🥇 1 单例模式 数据库连接、缓存客户端、全局配置
🥈 2 工厂模式 动态加载不同实现(如多租户、支付、存储)
🥉 3 代理模式 / AOP 事务、日志、鉴权、缓存
4 策略模式 不同业务策略(支付、路由、计算方式)
5 模板方法模式 标准化业务流程
6 职责链模式 请求处理流水线、过滤器链(如 Spring FilterChain)

今天是周六,周末愉快!更新常用设计模式系列最后一篇:职责链模式,本周写作任务也算圆满完成。

简介

职责链模式(Chain of Responsibility)是一种行为设计模式,它允许将请求沿着处理者链传递,直到被处理。适用于日志记录、权限验证等场景,避免请求发送者和接收者耦合。

核心思想

  • 每个处理者决定是否处理请求,或传递给下一个。
  • 链式结构,提高灵活性。

优点

  • 降低耦合度:请求发送者无需知道哪个对象会处理它的请求,只需要将请求发送到链上即可。
  • 增强灵活性:可以动态地改变链中处理者的顺序,或者增加、删除处理者。
  • 简化对象职责:每个处理者只需要处理自己职责范围内的工作,不符合的请求直接转发。
  • 便于扩展:新增处理者非常容易,符合开闭原则。

适用场景

职责链模式在以下场景中特别有用:

  • 多级处理系统:如审批流程、异常处理、事件冒泡
  • 不确定处理者的场景:需要动态指定处理对象
  • 可插拔的处理逻辑:如中间件、过滤器链

TypeScript 示例

假设审批流程:员工请假,经理->总监->CEO。

classDiagramclass Handler {-successor: Handler+setSuccessor(successor: Handler)+handleRequest(days: number)*}class Manager {+handleRequest(days: number)}class Director {+handleRequest(days: number)}class CEO {+handleRequest(days: number)}Handler <|-- ManagerHandler <|-- DirectorHandler <|-- CEOHandler o--> "0..1" Handler : successor
// 处理者抽象类
abstract class Handler {protected successor: Handler | null = null;setSuccessor(successor: Handler): void {this.successor = successor;}abstract handleRequest(days: number): void;
}// 具体处理者:经理
class Manager extends Handler {handleRequest(days: number): void {if (days <= 3) {console.log(`经理批准${days}天假`);} else if (this.successor) {this.successor.handleRequest(days);} else {console.log("无法批准");}}
}// 总监
class Director extends Handler {handleRequest(days: number): void {if (days <= 7) {console.log(`总监批准${days}天假`);} else if (this.successor) {this.successor.handleRequest(days);} else {console.log("无法批准");}}
}// CEO
class CEO extends Handler {handleRequest(days: number): void {if (days <= 30) {console.log(`CEO批准${days}天假`);} else {console.log("无法批准");}}
}// 使用
const manager = new Manager();
const director = new Director();
const ceo = new CEO();manager.setSuccessor(director);
director.setSuccessor(ceo);manager.handleRequest(2);  // 经理批准2天假
manager.handleRequest(5);  // 总监批准5天假
manager.handleRequest(20); // CEO批准20天假
manager.handleRequest(40); // 无法批准

真实案例

alibaba/Sentinel

alibaba/Sentinel 面向云原生微服务的高可用流控防护组件。

Sentinel 的核心机制之一,就是依靠 Slot Chain(槽链) 构建的一条完整职责链,用于处理限流、熔断、热点参数、系统规则等逻辑。

这一套体系是典型的职责链模式工程化实现:
每个 Slot 是一个 Handler,SlotChain 是责任链,具体 Slot 按顺序依次执行,某些 Slot 可以中断链。

1. 抽象节点:AbstractLinkedProcessorSlot

这是所有 Slot 的抽象父类,职责链核心结构就在这里。

public abstract class AbstractLinkedProcessorSlot<T> implements ProcessorSlot<T> {private ProcessorSlot<T> next;@Overridepublic void setNext(ProcessorSlot<T> next) {this.next = next;}@Overridepublic void entry(Context context, ResourceWrapper resourceWrapper, Object... args) throws Throwable {// 当前 Slot 的处理逻辑(留给子类 override)fireEntry(context, resourceWrapper, args);}protected void fireEntry(Context context, ResourceWrapper resourceWrapper, Object... args) throws Throwable {if (next != null) {next.entry(context, resourceWrapper, args);}}@Overridepublic void exit(Context context, ResourceWrapper resourceWrapper, Object... args) {// 当前 Slot 的 exit 逻辑fireExit(context, resourceWrapper, args);}protected void fireExit(Context context, ResourceWrapper resourceWrapper, Object... args) {if (next != null) {next.exit(context, resourceWrapper, args);}}
}

这是典型 CoR:每个节点既处理,也决定是否继续传递。

  • next 指向下一个 Slot → 链结构
  • 当前 Slot 做完自己的逻辑后调用 next.entry() → 请求向后传递
  • 如果某个 Slot 不调用 fireEntry,链会被中断(比如限流时抛出异常)

2. 责任链容器:ProcessorSlotChain

负责保存 slot 链的头节点,并按顺序执行 entry/exit。

public class ProcessorSlotChain extends AbstractLinkedProcessorSlot<Object> {private ProcessorSlot<Object> first = null;private ProcessorSlot<Object> end = null;public void addFirst(ProcessorSlot<?> slot) {slot.setNext(first);first = (ProcessorSlot<Object>) slot;if (end == null) {end = first;}}public void addLast(ProcessorSlot<?> slot) {if (first == null) {first = end = (ProcessorSlot<Object>) slot;} else {end.setNext(slot);end = (ProcessorSlot<Object>) slot;}}@Overridepublic void entry(Context context, ResourceWrapper resourceWrapper, Object... args) throws Throwable {if (first != null) {first.entry(context, resourceWrapper, args);}}@Overridepublic void exit(Context context, ResourceWrapper resourceWrapper, Object... args) {if (first != null) {first.exit(context, resourceWrapper, args);}}
}

这是职责链容器的标准实现:

  • first、end 维护了一条链表结构
  • addLast / addFirst 构造责任链
  • entry() 执行链首,之后顺链传递

3. 链构造器:DefaultSlotChainBuilder

负责按照既定顺序将各种 Slot 串成链。

public class DefaultSlotChainBuilder implements SlotChainBuilder {@Overridepublic ProcessorSlotChain build() {ProcessorSlotChain chain = new ProcessorSlotChain();// 1. 选择调用链chain.addLast(new NodeSelectorSlot());// 2. 统计调用数据chain.addLast(new ClusterBuilderSlot());// 3. 流控规则检查chain.addLast(new FlowSlot());// 4. 熔断规则检查chain.addLast(new DegradeSlot());// 5. 系统规则chain.addLast(new SystemSlot());return chain;}
}

职责链逻辑说明

  • 这是固定顺序的 Slot pipeline
  • 每个 Slot 是职责链中的一个 “处理节点”
  • 每个 Slot 的功能独立、解耦
  • 添加顺序决定了处理流程
  • 完全符合 GoF CoR 的链构建方式

4. 一个典型 Slot 示例:FlowSlot

这里是限流规则检查。限流发生时直接中断链。

public class FlowSlot extends AbstractLinkedProcessorSlot<DefaultNode> {@Overridepublic void entry(Context context, ResourceWrapper resourceWrapper, Object... args) throws Throwable {// 检查是否触发限流FlowRuleChecker.checkFlow(resourceWrapper, context, args);// 没有被限流:继续到下一个 slotfireEntry(context, resourceWrapper, args);}
}

职责链行为说明

  • FlowRuleChecker.checkFlow 若触发限流会抛异常
  • 链处理被 终止(典型 CoR:某节点可终止请求处理)
  • 未限流 → 调用 fireEntry() → 继续下一个 slot

这是职责链里典型的“拦截节点”。

5. 请求进入链:Sentinel 核心调用逻辑

CtSph.entry() 调用 slot 链的入口

ProcessorSlotChain chain = SlotChainProvider.newSlotChain();chain.entry(context, resourceWrapper, args);
  • 请求进入链首
  • 逐个 slot 执行
  • 期间任何 slot 抛 BlockException → 链终止

总结

flowchart LRC(Context) --> PSC[ProcessorSlotChain]PSC --> NS[NodeSelectorSlot]NS --> CB[ClusterBuilderSlot]CB --> FS[FlowSlot]FS --> DS[DegradeSlot]DS --> SS[SystemSlot]SS --> E(Exit)
  • Handler(处理节点): ProcessorSlot & 各种具体 Slot(FlowSlot、DegradeSlot…)
  • Handler 基类: AbstractLinkedProcessorSlot
  • 链(责任链): ProcessorSlotChain
  • 链构造器: DefaultSlotChainBuilder
  • 请求入口: CtSph.entry() 调用 SlotChain

Sentinel 通过 SlotChain 实现:

  • 可插拔 Slot
  • 多个 Slot 组成 pipeline
  • Slot 可决定是否继续传递请求(关键的 CoR 特征)
  • Slot 之间松耦合,遵循开闭原则
  • 真实工程中的高复杂度职责链,结构清晰可扩展

poppinss/middleware

poppinss/middleware本身就是一个 CoR(middleware pipeline)的实现。

import Middleware from '@poppinss/middleware'
import { NextFn } from '@poppinss/middleware/types'const context = {}
type MiddlewareFn = (ctx: typeof context, next: NextFn) => void | Promise<void>const middleware = new Middleware<MiddlewareFn>()middleware.add((ctx, next) => {console.log('executing fn1')await next()
})middleware.add((ctx, next) => {console.log('executing fn2')await next()
})await middleware.runner().run((fn, next) => fn(context, next))
  • const middleware = new Middleware<MiddlewareFn>():创建一个 Middleware 实例。这个类正是 CoR 的核心 — 它管理一个链(chain)。
  • middleware.add((ctx, next) => { ... }):通过 add 方法将一个中间件处理函数加入链中。对应 CoR 模式里“将一个处理器(handler)加入链”。
  • await next():在中间件内部调用 next(),表示把控制权传给链上的下一个处理器。正是 CoR “传递请求给下一个处理者”的机制。
  • .runner().run((fn, next) => fn(context, next)):创建一个 runner 来依次触发链上的处理器。run 方法遍历整个链,调度每一个中间件。

总结

职责链模式通过将请求的发送者和接收者解耦,提供了一种灵活的处理请求的方式。它在需要多级处理、动态指定处理者或实现可插拔架构的场景中表现出色。

在实际开发中,你可以根据具体需求选择适合的实现方式,无论是经典的固定链结构,还是更灵活的通用处理链,职责链模式都能为你的系统带来更好的可维护性和扩展性。

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

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

相关文章

fanuc 双安检实验指导书

实验:双安检功能实验学时:2~3学时实验目的与要求了解并掌握双安检功能原理以及应用,通过该功能的学习能够确保信号输入输出的正确性、保证机床处于准确的安全位置以及定期进行安全测试。实验内容双安检功能硬件连接…

Rust RefCell 多线程读为什么也panic了?

Rust RefCell 多线程读为什么也panic了?这是最近实战中遇到的一个小知识点,没理解之前觉得「不可能」,反应过来之后,觉得自己很蠢🤣,借本文记录下。 看一段复现代码: struct MyRefCell<T>(RefCell<T&…

关于样式

请大家使用亮色观看,目前暗色模式有些功能未开发

Java-Spring入门指南(二十四)SSM整合HTML:克服CSS/JS静态资源被过滤问题

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

1115noip模拟赛

8:15 想到T1正解,写完了 9:00 T2一开始想了个假贪心,构造了一组小数据卡掉了 10:00 想到了一个dp做法,写完过了样例 10:30 想T3没想出来,只想到了一个 \(O(N^3)\) 做法 10:50 写完T3暴力之后,发现T4是谢昀均之前想…

2025 最新推荐!汽车喇叭网生产厂家权威排行榜,0.01MM 精度 + 全工艺保障,靠谱品牌甄选

本次榜单由国际汽车零部件品质测评协会(IAQP)联合精密制造技术联盟共同发布,基于全球 200 余家企业的实测数据生成。测评采用 “四维评分体系”:工艺精度(30%)、品质稳定性(25%)、产能交付(25%)、服务适配性…

2025年毕业论文救星:6款免费AI写论文工具实测推荐

校园论坛上学生毕业论文写作难题引发共鸣,作者结合自身经历,实测推荐 2025 年 6 款免费 AI 写论文工具,包括 AI 论文及时雨、PaperNex、图灵论文 AI 写作助手等。这些工具各有特色,均能快速生成初稿,支持多种论文…

2025 最新推荐!汽车喇叭网生产厂家权威排行榜:0.01MM 精度 + 全工艺保障,靠谱品牌专业甄选

引言 在汽车产业向智能化、高端化加速转型的趋势下,汽车喇叭网作为影响音响音质与内饰美观的核心部件,市场需求持续攀升,行业对其精度、材质适配性及工艺复杂度的要求也日益严苛。国际汽车零部件协会(IAPPA)最新测…

二维固定一维+划分 4 个象限——P12617 [RMI 2023] Circles

二维固定一维+划分 \(4\) 个象限——P12617 [RMI 2023] Circles平面距离等没有固定顺序的,可以考虑划分为\(4\) 个象限分别考虑。发现对于一个点,的左上方,能对其产生贡献的点\((a,b)\) \(b\) 随 \(a\) 增大而减小。…

2025年雅思培训机构哪家强?1V1定制/封闭班/机考押题班/集训营高提分机构推荐

2025年雅思培训机构哪家强?1V1定制/封闭班/机考押题班/集训营高提分机构推荐行业权威榜单发布,优质机构综合测评​ 随着留学热潮的持续升温,雅思成绩作为海外院校申请的核心指标,其培训需求呈现爆发式增长。专业的…

2025 最新蚀刻加工厂家口碑推荐排行榜权威发布,涵盖精密蚀刻定制与不锈钢蚀刻加工优质服务商

本排行榜由国际精密制造协会联合行业测评机构共同打造,基于全球范围内 120 家蚀刻加工企业的实地调研数据生成,测评覆盖技术实力、产能规模、品质管控、服务响应四大核心维度,采用加权评分机制(技术占比 40%、品质…

ESP-IDF V5.4 开发环境搭建教程(基于 Windows11 WSL2 )

前言 最近因公司业务需要,接触了 ESP32 芯片,中途踩了不少坑,也慢慢熟悉了 ESP32 的开发流程。我使用了乐鑫官方的 ESP-IDF 作为编译工具,其他版本有 arduino-esp32、PlatformIO,但它们底层也是基于 ESP-IDF,只不…

PlotNeutralNet使用教程

PlotNeutralNet使用教程参考来源: https://blog.csdn.net/Zhanglw882/article/details/115537471 https://blog.csdn.net/qq_41605934/article/details/118423571 https://blog.csdn.net/li26324949/article/details/…

idf.py如何退出串口监视器模式?

使用 `idf.py monitor` 进入串口监视器模式后,如何正确退出而不中断或损坏串口连接?许多开发者在操作 ESP-IDF 项目时,习惯直接使用 Ctrl+C 终止进程,但这可能导致串口资源未释放、终端卡死或后续烧录失败。常见问…

2025雅思培训课程排行榜:高提分课程定制机构深度解析

2025雅思培训课程排行榜:高提分课程定制机构深度解析随着留学热潮的持续升温,雅思成绩作为海外院校申请的核心指标,其重要性愈发凸显。优质的雅思培训课程不仅能帮助学员精准攻克学习难点,更能高效提升应试能力,缩…

11.10-11.15 总结

11.10 11.11 模拟赛 打得不是很好,只通过了 \(A\) 题,另外几道题都挺有难度的。其中 \(B\) 题需要发现左子树只又 \(k^x\) 的性质。

Tomcat的常见问题

问题1出现上述问题首先先把internet选项中高级里面把TLS 1.1和TLS 1.2勾上然后重启windows在看看是否成功如果还是不成功依旧是上面的问题那很有可能是你配置文件里面写错了 注意:大小写,单词不要写错等问题2tomc…

2025 最新推荐!护栏厂家实力榜单,国际协会认证优质品牌,市政 / 铁路 / 桥梁专用护栏制造厂精选

随着全球基础设施建设标准化推进,护栏作为安全防护核心设施的品质要求持续升级。据国际道路安全协会(IRSA)2024 年度测评数据显示,优质护栏可降低 62% 的道路安全事故损失,但市场上 38% 的产品存在原材料不达标、…

2025 最新净水器经销商推荐排行榜,精选优质服务商 涵盖直饮 / 反渗透等多类型设备直饮水净水器/过滤净水器/反渗透净水器公司推荐

引言 随着健康意识升级与企业成本管控需求凸显,净水器已成为企事业单位与家庭的刚需设备,但市场品牌繁杂、服务质量参差不齐的问题日益突出。传统桶装水的卫生隐患、高成本与净水器行业 “产品品质无保障、售后响应慢…

2025年芹黄素实力厂家权威推荐榜单:芹菜苷元/芹菜素/芹菜素95%源头厂家精选

在大健康产业蓬勃发展的背景下,植物提取物作为连接天然资源与终端应用的关键环节,其市场需求持续攀升。 芹黄素,又称芹菜素或芹菜苷元,是一种具有广泛应用价值的黄酮类化合物,在医药、保健品、食品和化妆品等领域…