首页 > 后端开发 > C++ > 正文

c++如何实现一个责任链模式_c++行为型设计模式Chain of Responsibility【源码】

穿越時空
发布: 2025-12-12 11:27:07
原创
890人浏览过
责任链模式在C++中通过抽象处理者Handler定义处理接口和后继引用,具体处理者按需处理或转发请求,客户端调用链头即可自动流转;示例含Level1/Level2Handler及unique_ptr链式组装。

c++如何实现一个责任链模式_c++行为型设计模式chain of responsibility【源码】

责任链模式在 C++ 中的核心是:让多个对象都有机会处理请求,避免请求发送者与接收者耦合,将这些对象连成一条链,并沿着这条链传递请求,直到有对象处理它为止。

定义抽象处理者(Handler)

这是责任链的基类,负责声明处理接口和持有下一个处理者的引用。关键点是“可选地”向下转发请求,由子类决定是否处理或继续传递。

  • 用纯虚函数 handleRequest() 定义处理逻辑契约
  • std::unique_ptr 或原始指针(需手动管理)保存 successor(后继)
  • 提供 setNext() 方法方便链式组装(返回 *this 支持流式调用更佳)

实现具体处理者(ConcreteHandler)

每个具体类继承 Handler,重写 handleRequest():先判断是否能/应处理当前请求;若不能,调用 next->handleRequest() 转发。

  • 判断条件可以是请求类型(如 int code)、内容(如 string cmd)、权限级别等
  • 注意避免空指针解引用:检查 next 是否非空再调用
  • 可选择“处理后仍转发”(日志+授权)或“处理即终止”(权限拦截)

构建与使用责任链

链通常在客户端手动创建,也可封装进工厂或配置类。推荐使用 RAII 管理生命周期(如用 unique_ptr 构建)。

码上飞
码上飞

码上飞(CodeFlying) 是一款AI自动化开发平台,通过自然语言描述即可自动生成完整应用程序。

码上飞 430
查看详情 码上飞

立即学习C++免费学习笔记(深入)”;

  • 顺序很重要:把通用/兜底处理器(如 DefaultHandler)放在链尾
  • 示例链:AuthHandler → RateLimitHandler → CommandHandler → DefaultHandler
  • 发起请求只需调用链头的 handleRequest(),其余自动流转

一个轻量可运行的源码示例

// Handler.h
class 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.h
class 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.cpp
int 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【源码】的详细内容,更多请关注php中文网其它相关文章!

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号