news 2026/5/1 7:59:19

设计模式[13]——责任链模式一分钟彻底说透

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
设计模式[13]——责任链模式一分钟彻底说透

设计模式[13]——责任链模式(Chain of Responsibility)一分钟彻底说透(C++版·软件领域真实例子)

一句话定义

将请求沿着一条“链”传递,每个处理者决定自己处理交给下一个,避免请求发送者和接收者之间的直接耦合。

最狠的比喻(软件人专属)

HTTP中间件链(类似Express/Koa/Drogon):

  • 请求进来 → 先日志记录 → 再权限校验 → 再限流 → 再CSRF检查 → 最后到业务处理
  • 任何一个环节可以直接返回响应(拒绝请求),或继续往下传
    客户端完全不知道中间经历了多少层!
为什么需要它?(坏味道瞬间爆炸)

不用责任链,你会写出这种if-else地狱:

if(request.isAdmin()){if(request.rateLimitOk()){if(request.csrfValid()){handleBusiness(request);// 嵌套到吐}}}

明天加一个“黑名单检查”?所有代码全改,寄!

和装饰器模式到底像不像?(10秒彻底分清)

很多人觉得责任链和装饰器长得太像(都持有一个next,都转发调用),但意图和行为完全不同:

项目装饰器模式(Decorator)责任链模式(Chain of Responsibility)
核心意图增强功能:每层都执行,层层叠加职责寻找处理者:只有一个(或少数)处理请求
链上每个节点行为必须全部执行(日志→压缩→加密 全跑一遍)任一节点可终止链(认证失败就直接返回)
执行顺序固定顺序,层层包裹(先加奶再加糖)动态传递,直到有人处理(可能前几个直接拦截)
返回结果累积结果(价格 = 基础 + 奶 + 糖 + 摩卡)通常一个最终响应(成功或拒绝)
客户端期望得到一个“增强版”对象,功能更多得到一个处理结果,谁处理无所谓
典型例子数据流:Logging → Compression → EncryptionWeb中间件:Logging → Auth → RateLimit → Business
关键代码区别每层调用component->operation()并追加自己的行为每层if (我能处理) { 处理并结束 } else { next }
口号“层层叠加,全跑一遍”“传下去,直到有人接”

狠比喻:

  • 装饰器 = 给汉堡层层加配料,每层配料都必须加,最终吃到一个超级汉堡(缺一层都不行)。
  • 责任链 = 公司请假审批,只要有人批了就结束,前面的人拒绝就直接完蛋(不一定走到老板)。
真实软件例子:Web请求处理链(中间件系统)
#include<iostream>#include<memory>#include<string>usingnamespacestd;// 1. 请求上下文structHttpRequest{string user;string path;boolauthenticated=false;string body;};// 2. 处理者基类classHandler{protected:unique_ptr<Handler>next;public:virtual~Handler()=default;voidsetNext(unique_ptr<Handler>n){next=move(n);}virtualboolhandle(HttpRequest&req)=0;boolhandleNext(HttpRequest&req){if(next)returnnext->handle(req);returnfalse;// 链末尾没人处理}};// 3. 具体处理者classLoggingHandler:publicHandler{public:boolhandle(HttpRequest&req)override{cout<<"[Logging] 请求来自用户: "<<req.user<<" 路径: "<<req.path<<endl;returnhandleNext(req);// 日志不拦截,继续传}};classAuthHandler:publicHandler{public:boolhandle(HttpRequest&req)override{cout<<"[Auth] 检查认证...\n";if(req.user!="admin"){cout<<"[Auth] 认证失败,拒绝访问\n";returntrue;// 终止链}cout<<"[Auth] 认证通过\n";returnhandleNext(req);}};classRateLimitHandler:publicHandler{public:boolhandle(HttpRequest&req)override{cout<<"[RateLimit] 检查限流...\n";if(req.user=="guest"){cout<<"[RateLimit] 触发限流,拒绝\n";returntrue;// 终止}returnhandleNext(req);}};classBusinessHandler:publicHandler{public:boolhandle(HttpRequest&req)override{cout<<"[Business] 处理核心业务逻辑: "<<req.path<<endl;cout<<"业务处理完成,返回响应\n";returntrue;// 正常结束}};
客户端:组装链,一劳永逸
intmain(){autochain=make_unique<LoggingHandler>();chain->setNext(make_unique<AuthHandler>());chain->setNext(make_unique<RateLimitHandler>());chain->setNext(make_unique<BusinessHandler>());// 测试不同请求HttpRequest req1{"admin","/api/data"};cout<<"=== 请求1:管理员访问 ===\n";chain->handle(req1);cout<<"\n=== 请求2:普通用户访问 ===\n";HttpRequest req2{"guest","/api/data"};chain->handle(req2);cout<<"\n=== 请求3:未认证用户 ===\n";HttpRequest req3{"hacker","/admin"};chain->handle(req3);}
C++ 真实项目里无处不在
  • Web框架:Drogon/Crow的中间件链
  • GUI事件处理:Qt的event filter链
  • 日志库:多个Appender链式处理
  • 审批流程:请假 → 部门经理 → HR → 总经理
  • 异常处理:try-catch链(变体)
终极口诀(后端开发者专属)

“请求沿链往下传,谁能处理谁来管;
耦合彻底解,中间件随便加!”

刻在DNA里的一句话

当你有“多个处理者依次处理同一个请求”,且处理顺序固定、任一环节可中断时,
立刻上责任链模式——链式组装,解耦到底,扩展性拉满!

现在,责任链和装饰器在你脑子里彻底分家了吧?
下一期命令模式(Command)[14],准备好了吗?

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/28 23:52:54

Fabric8 Kubernetes客户端终极指南:Java开发者的云原生利器

Fabric8 Kubernetes客户端终极指南&#xff1a;Java开发者的云原生利器 【免费下载链接】kubernetes-client Java client for Kubernetes & OpenShift 项目地址: https://gitcode.com/gh_mirrors/ku/kubernetes-client Fabric8 Kubernetes客户端是专为Java开发者设…

作者头像 李华
网站建设 2026/5/1 7:53:44

Godex:重构Godot游戏开发范式的ECS架构引擎

Godex&#xff1a;重构Godot游戏开发范式的ECS架构引擎 【免费下载链接】godex Godex is a Godot Engine ECS library. 项目地址: https://gitcode.com/gh_mirrors/go/godex 在现代游戏开发领域&#xff0c;性能优化和代码可维护性始终是开发者面临的核心挑战。Godex作为…

作者头像 李华
网站建设 2026/5/1 7:51:30

Kotaemon方言识别支持:地域性知识服务拓展

Kotaemon方言识别支持&#xff1a;地域性知识服务拓展 在智慧政务、远程医疗和数字教育快速普及的今天&#xff0c;一个常被忽视的现实是&#xff1a;仍有数亿人因语言障碍难以真正融入智能服务体系。他们可能是只会说粤语的广州老人&#xff0c;是习惯用闽南语交流的泉州渔民&…

作者头像 李华
网站建设 2026/4/20 11:54:11

Espanso文本扩展器完全手册:5个技巧让你的输入效率翻倍

Espanso文本扩展器完全手册&#xff1a;5个技巧让你的输入效率翻倍 【免费下载链接】espanso Cross-platform Text Expander written in Rust 项目地址: https://gitcode.com/gh_mirrors/es/espanso 你是否曾经在重复输入同样的地址、签名或代码片段时感到厌倦&#xff…

作者头像 李华
网站建设 2026/4/25 12:47:48

终极U盘量产工具:Chipsbank APTool V7200快速修复与批量生产完整指南

终极U盘量产工具&#xff1a;Chipsbank APTool V7200快速修复与批量生产完整指南 【免费下载链接】ChipsbankAPTool量产工具V72002020-00-21 Chipsbank APTool量产工具是专门针对Chipsbank生产的USB控制芯片设计的一款强大工具。本版本V7200发布于2020年2月21日&#xff0c;针对…

作者头像 李华
网站建设 2026/5/1 6:10:14

Kotaemon助力制造业知识管理数字化转型

Kotaemon助力制造业知识管理数字化转型在一家大型汽车零部件工厂的车间里&#xff0c;一位刚上岗的年轻操作员面对一台突然报错停机的数控机床手足无措。他没有呼叫主管&#xff0c;也没有翻找厚厚的操作手册&#xff0c;而是打开手机上的一个小程序&#xff0c;轻声问&#xf…

作者头像 李华