新闻中心

C++如何实现一个职责链模式_C++设计模式之解耦请求发送者和接收者

2025-12-02
浏览次数:
返回列表
职责链模式通过抽象基类定义处理接口,使用智能指针连接具体处理者,使请求沿链传递直至被处理或终止,实现发送者与接收者的解耦,适用于审批、消息路由等多处理者场景。

c++如何实现一个职责链模式_c++设计模式之解耦请求发送者和接收者

在C++中实现职责链模式,核心是将请求的发送者与接收者解耦,让多个对象都有机会处理请求,从而避免请求发送者与具体接收者之间的紧耦合。这种模式特别适用于有多个处理者可能处理同一请求,但具体由谁处理需在运行时决定的场景。

职责链模式的基本结构

职责链模式包含以下几个关键角色:

  • Handler(处理者):定义处理请求的接口,并持有下一个处理者的引用。
  • ConcreteHandler(具体处理者):实现处理逻辑,判断是否能处理当前请求,若不能则转发给下一节点。
  • Client(客户端):创建处理链并发送请求。

通过这种方式,请求沿着链传递,直到被某个处理者处理或到达链尾。

使用抽象基类和指针构建链式结构

在C++中,通常使用抽象基类来定义处理接口,再通过智能指针或原始指针连接各个处理者。

魔术橡皮擦 魔术橡皮擦

智能擦除、填补背景内容

魔术橡皮擦 80 查看详情 魔术橡皮擦 // Handler.h #include #include iostream> class Handler { public: virtual ~Handler() = default; void setNext(std::shared_ptr next); void handleRequest(int request); protected: std::shared_ptr nextHandler; virtual bool canHandle(int request) = 0; virtual void process(int request) = 0; }; void Handler::setNext(std::shared_ptr next) { nextHandler = next; } void Handler::handleRequest(int request) { if (canHandle(request)) { process(request); } else if (nextHandler) { nextHandler->handleRequest(request); } else { std::cout // ConcreteHandlers.h class Level1Handler : public Handler { protected: bool canHandle(int request) override { return request

构建和使用处理链

客户端代码负责组装处理链,并发起请求。

#include "ConcreteHandlers.h" int main() { auto h1 = std::make_shared(); auto h2 = std::make_shared(); auto h3 = std::make_shared(); h1->setNext(h2); h2->setNext(h3); // 发送不同请求 h1->handleRequest(5); // Level1 处理 h1->handleRequest(20); // Level2 处理 h1->handleRequest(80); // Level3 处理 h1->handleRequest(150); // 无处理者处理 return 0; }

在这个例子中,请求从h1开始传递,每个处理者判断自己是否能处理,否则交给下一个。这样就实现了发送者(main函数中的调用)与最终接收者之间的解耦。

实际应用中的优化点

  • 使用std::shared_ptr管理生命周期,避免内存泄漏。
  • 可加入优先级机制,动态调整链顺序。
  • 支持链的拆分与合并,适应复杂业务流程。
  • 添加日志记录,便于调试追踪请求路径。

基本上就这些。职责链模式在审批流程、异常处理、消息路由等场景非常实用,关键是设计好处理者的判断条件和链的组织方式。不复杂但容易忽略的是边界情况处理和资源管理。

以上就是C++如何实现一个职责链模式_C++设计模式之解耦请求发送者和接收者的详细内容,更多请关注其它相关文章!


# c++  # ios  # 路由  # ai  # LV推广与营销  # seo il hyun  # 梧州本地网站建设排名  # seo排名优化品牌  # 小布哥SEO  # 本地智能营销推广平台是什么  # 太原网站建设价钱  # 薯条推广存在营销意图吗  # 域名选择seo  # 邢台抖音seo优化厂家  # 都有  # 几个  # 客户端  # 的是  # 如何用  # 是否能  # 链式  # 适用于  # 多个  # 如何实现  # red  # stream 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: J*aScript Promise链中如何正确终止后续.then执行并处理错误  Composer的 archive 命令怎么用_快速打包你的PHP项目及其Composer依赖  Mudbox图层蒙版怎么用_Mudbox图层蒙版数字雕刻应用技巧  纯CSS与HTML网格布局的HTML精简策略:SVG与JS方案解析  印象笔记怎样用批量导出备知识库_印象笔记用批量导出备知识库【备份方法】  抖音网页版企业服务中心登录入口_抖音网页版企业登录平台  LINUX的I/O重定向是什么_深入理解LINUX中 >、>> 与 < 的区别  蛙漫正版漫画平台入口_蛙漫免费阅读全站漫画资源  我的世界官方游戏入口 我的世界官网平台直达链接  在J*a中如何开发简易电子商务商品管理系统_商品管理系统项目实战解析  微博网页版主页入口 微博官方网站免登录访问  XML中包含HTML标签导致解析错误? 正确嵌入非XML数据的两种方法  知音漫客官网漫画下载_知音漫客网页版阅读记录  Sublime Text怎么设置垂直标尺_Sublime配置Rulers规范代码长度  yandex入口引擎手机版 yandex安卓版下载入口  Django表单验证失败时保留用户输入数据的最佳实践  汽车之家官方网站官网入口_汽车之家网页版直接进入  如何创建没有密码的Windows本地账户_跳过微软账户登录的技巧【教程】  如何解决电商平台定制报价请求的“黑洞”问题,SprykerQuoteRequest模块助你提升客户体验与销售效率  生成rdflib自定义SPARQL函数:参数匹配与实践指南  taptap防沉迷怎么解除 taptap解除健康系统限制说明【2025最新】  限制HTML日期输入框的日期选择范围  React Router 嵌套组件中 URL 重定向问题的解决方案  如何使用J*aScript精确选择并批量修改特定父元素下子链接的样式  c++中的std::forward_list和std::list有什么不同_c++ forward_list与list区别分析  Golang如何实现Web接口签名验证_Golang Web接口签名校验开发方法  印象笔记如何设提醒任务防漏执行_印象笔记设提醒任务防漏执行【任务提醒】  在Typer应用中优雅地处理和重组任意命令行参数  机器学习中对数变换预测结果的反向还原  微博网页版怎么开启两步验证_微博网页版账号安全两步验证设置方法  163邮箱登录密码 163邮箱忘记密码找回  我的世界mc.js免费游戏直接能玩 我的世界mc.js小游戏免费秒玩入口  单12V-2&#215;6实现为RTX 5090供电750W!甚至都没敢跑分  Composer如何解决json扩展缺失的错误  支付宝如何管理隐私设置_支付宝隐私保护的配置技巧  J*a里如何实现线程安全的懒加载单例_懒加载单例实现方法解析  QQ邮箱官网登录入口 QQ邮箱网页版邮箱快速登录  快手官方唯一登录入口 谨防山寨钓鱼网站  Linux如何构建多环境配置管理_Linux多环境配置方案  千牛数据看板网页版_千牛数据看板网页版访问方法  vivo浏览器自带的下载器速度慢怎么办 vivo浏览器提升文件下载速度的技巧  QQ邮箱在线登录平台 QQ邮箱个人邮箱网页版入口  深入理解Go语言中的指针类型:以*string为例  MAC怎么让Dock栏只显示当前运行的应用_MAC终端命令实现极简Dock栏  机构:以往存储涨价周期小米利润率实际上有所改善 能转嫁给消费者等  包子漫画官方网站在线链接-包子漫画在线阅读平台主页地址  C#使用XPath查询节点时出错? 常见语法错误与调试技巧  一加 14R 快充无反应_一加 14R 充电优化  1688商家版怎样分析买家画像精准供货_1688商家版分析买家画像精准供货【供货策略】  Android Studio计算器C键功能异常排查与修复教程 

搜索