责任链模式在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 构建)。
立即学习“C++免费学习笔记(深入)”;
顺序很重要:把通用/兜底处理器(如 DefaultHandler)放在链尾 示例链:AuthHandler → RateLimitHandler → CommandHandler → DefaultHandler 发起请求只需调用链头的 handleRequest(),其余自动流转
一个轻量可运行的源码示例
// Handler.h
class Handler {protected: std::unique_ptr next;public: virtual ~Handler() = default; Handler& setNext(std::unique_ptr h) { next = std::move(h); return *this; } virtual void handleRequest(int request) = 0;};
// ConcreteHandlers.h
class Level1Handler : public Handler {public: void handleRequest(int req) override { if (req < 10) { std::cout << "Level1 handled: " << req <handleRequest(req); } }};class Level2Handler : public Handler {public: void handleRequest(int req) override { if (req < 50) { std::cout << "Level2 handled: " << req <handleRequest(req); } }};
// main.cpp
int main() { auto h1 = std::make_unique(); auto h2 = std::make_unique(); 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【源码】的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1488591.html
微信扫一扫
支付宝扫一扫