新闻中心
c++如何实现一个责任链模式_c++行为型设计模式Chain of Responsibility【源码】
责任链模式在C++中通过抽象处理者Handler定义处理接口和后继引用,具体处理者按需处理或转发请求,客户端调用链头即可自动流转;示例含Level1/Level2Handler及unique_ptr链式组装。

责任链模式在 C++ 中的核心是:让多个对象都有机会处理请求,避免请求发送者与接收者耦合,将这些对象连成一条链,并沿着这条链传递请求,直到有对象处理它为止。
定义抽象处理者(Handler)
这是责任链的基类,负责声明处理接口和持有下一个处理者的引用。关键点是“可选地”向下转发请求,由
子类决定是否处理或继续传递。
- 用纯虚函数 handleRequest() 定义处理逻辑契约
- 用 std::unique_ptr
或原始指针(需手动管理)保存 successor(后继) - 提供 setNext() 方法方便链式组装(返回 *this 支持流式调用更佳)
实现具体处理者(ConcreteHandler)
每个具体类继承 Handler,重写 handleRequest():先判断是否能/应处理当前请求;若不能,调用 next->handleRequest() 转发。
- 判断条件可以是请求类型(如 int code)、内容(如 string cmd)、权限级别等
- 注意避免空指针解引用:检查 next 是否非空再调用
- 可选择“处理后仍转发”(日志+授权)或“处理即终止”(权限拦截)
构建与使用责任链
链通常在客户端手动创建,也可封装进工厂或配置类。推荐使用 RAII 管理生命周期(如用 unique_ptr 构建)。
- 顺序很重要:把通用/兜底处理器(如 DefaultHandler)放在链尾
- 示例链:AuthHandler → RateLimitHandler → CommandHandler → DefaultHandler
- 发起请求只需调用链头的 handleRequest(),其余自动流转
一个轻量可运行的源码示例
// Handler.hclass Handler {
protected:
std::unique_ptr<Handler> next;
public:
virtual ~Handler() = default;
Handler& setNext(std::unique_ptr<Handler> h) {
next = std::move(h);
return *this;
}
virtual void handleRequest(int request) = 0;
};
// ConcreteHandlers.hclass Level1Handler : public Handler {
public:
void handleRequest(int req) override {
if (req < 10) {
std::cout << "Level1 handled: " << req << "\n";
} else if (next) {
next->handleRequest(req);
}
}
};
class Level2Handler : public Handler {
public:
void handleRequest(int req) override {
if (req < 50) {
std::cout << "Level2 handled: " << req << "\n";
} else if (next) {
next->handleRequest(req);
}
}
};
// main.cppint main() {
auto h1 = std::make_unique<Level1Handler>();
auto h2 = std::make_unique<Level2Handler>();
h1->setNext(std::move(h2));
h1->handleRequest(5); // → Level1
h1->handleRequest(25); // → Level2
h1->handleRequest(100); // → no output (no default handler)
}
基本上就这些。责任链不是必须用动态多态——C++ 还可用模板递归(编译期链)、std::variant + visitor 实现更现代的变体,但虚函数链最直观、易调试、符合经典定义。关键不在“链”的形式,而在“解耦请求与处理者”和“延迟决定谁处理”的意图。
以上就是c++++如何实现一个责任链模式_c++行为型设计模式Chain of Responsibility【源码】的详细内容,更多请关注其它相关文章!
# 前向
# 品牌首页网站怎么做推广
# 乳山外贸网站推广
# 亳州推广短信营销
# 推广一个新上线的网站
# 百度推广网站运营
# 青岛网站推广建议j青岛博采网络
# 美团seo营销
# 营销推广会议策划方案
# seo网络高清传输器
# 网站推广最有效的方式
# 客户端
# 处理器
# 装进
# 什么用
# 如何处理
# 多态
# 子类
# 链式
# 递归
# 如何实现
# c++
# ai
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
Golang如何使用bytes.Split分割字节切片_Golang bytes切片分割方法
b站怎么取消点赞_b站点赞取消操作方法
现代化 SciPy 一维插值:interp1d 的替代方案与最佳实践
我的世界mc.js免费游戏直接能玩 我的世界mc.js小游戏免费秒玩入口
Golang并发任务中错误如何聚合_Golang goroutine error收集方式
Win11怎么关闭快速启动_Win11彻底关机设置教程
微博网页版直接访问 微博网页版账号管理快速入口
如何创建独立于主系统的J*a运行环境_隔离式环境搭建策略
漫蛙漫画官方首页 漫蛙2漫画在线阅读入口
优化 Python 函数中的条件逻辑:解决 if-else 嵌套与参数选择问题
钉钉视频会议声音异常如何处理 钉钉会议音频修复技巧
PHP高效扁平化嵌套数组:使用array_merge与数组解包操作符
Python Socket多播通信中指定源IP地址的实践指南
QQ邮箱登录首页官网地址2026 QQ邮箱官方网页入口
J*a里如何使用forEach遍历Map_Map遍历方法说明
抖音网页版平台入口 抖音网页版官网在线访问教程
Go语言中JSON数据解码与字段访问指南
css链接悬停下划线样式如何自定义_使用::after结合content和transition
腾讯QQ邮箱登录入口_QQ邮箱官方网站使用地址
Golang如何处理RPC请求负载均衡_Golang RPC请求负载均衡策略与实践
ACG动漫视频网入口 ACG动漫*免费正版观看地址
顺丰快递查询系统 官方正版查询入口
LINUX的perf命令入门_LINUX官方性能分析工具的使用与解读
Golang如何实现Web文件静态资源服务器_Golang静态资源服务器开发与实践
圆通快递查询实时追踪 圆通物流包裹状态快速查看
Highcharts 雷达图径向轴标签定制指南:利用多Y轴实现数值标注
Windows10怎么开启夜间模式 Windows10系统设置调整色温与亮度缓解夜间用眼疲劳【教程】
Yandex官方入口网址 Yandex俄罗斯搜索引擎最新在线地址
QQ邮箱稳定登录入口_QQ邮箱官方网站网页版使用
如何在 Excel Online 和 Google 表格中更改日期格式
Go语言中动态执行代码字符串的策略与实践
整合Supabase认证与Django模型:跨模式迁移的解决方案
win11如何卸载Windows更新补丁 Win11解决更新导致系统不稳定的问题【修复】
微信网页版登录教程_微信网页版登录入口在哪
不会效仿卡普空!《铁拳》制作人澄清:不采取赛事付费|直播|
拷贝漫画电脑版官网入口 拷贝漫画(PC版)在线直达
Linux如何排查内存不足OOME问题_LinuxOOM分析教程
微博网页版怎么开启两步验证_微博网页版账号安全两步验证设置方法
CSS实现侧边栏导航项全宽圆角悬停背景效果
解决J*aScript中重复选择项的确认对话框显示问题
C++ vector二维数组定义_C++ vector of vector用法
Win11怎么开启卓越性能模式 Win11电源选项启用高性能释放硬件潜力【方法】
Golang如何优化内存分配与垃圾回收_Golang内存管理与GC优化实践
提升Kafka消费者健壮性:会话超时处理与消息处理语义
QQ邮箱官方网站登录入口_QQ邮箱网页版在线使用
夸克浏览器桌面版同步不了书签怎么处理 夸克浏览器跨设备同步异常解决方案
Python中如何避免重复条件判断:利用数据结构实现动态逻辑
黑猫投诉统一入口官网 消费者权益保护投诉平台
Win11怎么查看电脑配置_Win11硬件配置检测工具使用
sublime怎么设置启动时打开的窗口_sublime会话管理与热退出


2025-12-12
浏览次数:次
返回列表