新闻中心

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

2025-12-12
浏览次数:
返回列表
责任链模式在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 构建)。

  • 顺序很重要:把通用/兜底处理器(如 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【源码】的详细内容,更多请关注其它相关文章!


# 前向  # 品牌首页网站怎么做推广  # 乳山外贸网站推广  # 亳州推广短信营销  # 推广一个新上线的网站  # 百度推广网站运营  # 青岛网站推广建议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会话管理与热退出 

搜索