新闻中心

C++怎么实现一个责任链模式_C++设计模式与责任链模式实现

2025-11-12
浏览次数:
返回列表
责任链模式通过请求在处理者链中传递实现解耦,C++中以抽象Handler定义接口,具体处理者继承并决定处理或转发请求,示例中主管、经理、总监按金额逐级审批,使用智能指针管理生命周期,支持动态构建链与多级处理,适用于审批流等场景。

c++怎么实现一个责任链模式_c++设计模式与责任链模式实现

责任链模式(Chain of Responsibility Pattern)是一种行为设计模式,它允许你将请求沿着处理者链进行传递,直到某个处理者决定处理该请求。在C++中实现责任链模式,关键是定义一个抽象处理者类,并让具体处理者在链中依次尝试处理请求。

责任链模式的核心结构

责任链模式通常包含以下角色:

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

基础C++实现示例

下面是一个简单的C++责任链实现,模拟审批流程:不同级别的管理者可以处理不同金额的报销申请。

#include <iostream>
#include <memory>

// 抽象处理者
class Approver {
protected:
    std::unique_ptr<Approver> next;
    std::string name;

public:
    Approver(const std::string& n) : name(n) {}

    // 设置后继者
    void setNext(std::unique_ptr<Approver> nextApprover) {
        next = std::move(nextApprover);
    }

    // 处理请求
    virtual void processRequest(double amount) = 0;

    // 转发请求到下一级
    void passToNext(double amount) {
        if (next) {
            next->processRequest(amount);
        } else {
            std::cout << "No one can approve the request for $" << amount << "\n";
        }
    }
};

// 具体处理者:主管
class Supervisor : public Approver {
public:
    Supervisor() : Approver("Supervisor") {}

    void processRequest(double amount) override {
        if (amount <= 1000) {
            std::cout << name << " approves request for $" << amount << "\n";
        } else {
            std::cout << name << " cannot handle $" << amount << ", passing to next...\n";
            passToNext(amount);
        }
    }
};

// 具体处理者:经理
class Manager : public Approver {
public:
    Manager() : Approver("Manager") {}

    void processRequest(double amount) override {
        if (amount <= 5000) {
            std::cout << name << " approves request for $" << amount << "\n";
        } else {
            std::cout << name << " cannot handle $" << amount << ", passing to next...\n";
            passToNext(amount);
        }
    }
};

// 具体处理者:总监
class Director : public Approver {
public:
    Director() : Approver("Director") {}

    void processRequest(double amount) override {
        if (amount <= 20000) {
            std::cout << name << " approves request for $" << amount << "\n&quot;;
        } else {
            std::cout << name << " cannot handle $" << amount << ", escalating...\n";
            passToNext(amount);
        }
    }
};

使用示例:

Perplexity Perplexity

Perplexity是一个ChatGPT和谷歌结合的超级工具,可以让你在浏览互联网时提出问题或获得即时摘要

Perplexity 302 查看详情 Perplexity
int main() {
    // 构建责任链
    auto supervisor = std::make_unique<Supervisor>();
    auto manager = std::make_unique<Manager>();
    auto director = std::make_unique<Director>();

    supervisor->setNext(std::move(manager));
    supervisor->next->setNext(std::move(director));

    // 发送请求
    supervisor->processRequest(500);     // 主管处理
    supervisor->processRequest(3000);    // 经理处理
    supervisor->processRequest(15000);   // 总监处理
    supervisor->processRequest(25000);   // 无人处理

    return 0;
}

关键点说明与优化建议

这个模式的优势在于解耦请求发送者和接收者。你可以根据实际需求扩展功能:

  • 使用智能指针避免内存泄漏,如示例中的 std::unique_ptr
  • 可在运行时动态构建链,比如从配置文件读取处理顺序。
  • 某些场景下允许多个处理者参与(不中断链),可移除条件判断后的中断逻辑。
  • 添加日志或审计功能,在每个处理者中记录操作。

责任链适用于审批流、事件处理、过滤器链等场景。C++中通过虚函数和多态实现灵活性,结合现代C++特性可写出清晰安全的代码。

基本上就这些。结构清晰,扩展性强,适合需要层级处理逻辑的系统。

以上就是C++怎么实现一个责任链模式_C++设计模式与责任链模式实现的详细内容,更多请关注其它相关文章!


# 互联网  # 绍兴网站建设包含哪些  # 山西网站建设服务器推荐  # 北区抖音seo优化报价  # 短剧营销推广方案模板怎么写  # 人大网站的建设  # 杭州正规的seo优化  # seo网站推广营销  # 烧烤推广营销主题怎么写  # 四川推广营销价钱  # 荆门服装seo推广公司  # 链中  # 是一种  # app  # 操作方法  # 如何使用  # 尼克  # 多态  # 适用于  # 是一个  # 配置文件  # stream  # ios  # c++  # ai 


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


相关推荐: C++如何操作注册表_Windows平台下C++读写注册表的API函数详解  Descript怎样用AI剪辑自动去噪_Descript用AI剪辑自动去噪【自动降噪】  sublime如何只显示或隐藏特定类型文件_sublime侧边栏文件过滤  为什么简单的XML文件也会解析失败? 检查隐藏的非打印字符(如BOM)的方法  CSS Flexbox与媒体查询:实现响应式布局中元素的并排与堆叠  sublime怎么格式化代码_sublime代码美化与一键排版插件配置  在J*a中如何开发简易博客标签推荐系统_博客标签推荐项目实战解析  迅雷下载到U盘速度很慢怎么办_迅雷U盘下载慢优化方法  谷歌google账号注册详细步骤 谷歌账号注册官方教程  Go Martini框架:动态服务解码后的图片内容  Typer应用中动态命令行参数的解析与处理  Win10系统怎么查看已安装更新_Win10卸载有问题的更新补丁  QQ邮箱官方登录入口_QQ邮箱网页版快捷使用平台  GemBox Document HTML转PDF垂直文本渲染问题及解决方案  Golang如何使用buffered channel提高性能_Golang buffered channel优化技巧  高德地图公交到站提醒失败如何解决 高德提醒权限设置  12306选座怎么选到商务座_12306商务座选择与配置说明  响应式容器内容自动缩放与宽高比维持教程  J*aScript DOM操作:高效清空列表元素的策略与实践  自定义Bag-of-Words实现:处理带负号的词汇权重  PHP表单数据传递:如何通过隐藏输入字段获取动态ID  J*aScript设计模式实践_j*ascript代码优化  学习通在线学习平台 学习通网页版直接进入课程中心  J*a应用集成GitHub CLI与API认证指南  实现全屏滚动与导航点:专业教程  EMS快递官网app_中国邮政速递物流手机客户端  淘宝支付提示失败如何解决 淘宝支付流程优化方法  红果短剧网页版官网入口 官方最新网址发布  Composer如何处理Git子模块(submodule)依赖_Composer与Git Submodule的对比与选择  Angular响应式表单:实现提交后表单及按钮的禁用与只读化  汽水音乐在线版入口_汽水音乐网页播放手册  HTML元素状态管理:根据DIV内容动态启用/禁用按钮  解决J*aScript中重复选择项的确认对话框显示问题  Odoo 16:在表单视图中基于当前记录动态修改Tree视图属性  小红书怎么解除第三方平台绑定_小红书多平台登录解绑方法介绍  AO3官方镜像站点汇总 AO3同人作品网页版直达链接  《主播少女的秘密账号迷宫》首支宣传片  HuggingFaceEmbeddings中向量嵌入维度调整的限制与理解  Golang并发任务中错误如何聚合_Golang goroutine error收集方式  微博网页版首页入口 微博电脑端官网登录链接  Golang如何使用bytes.Split分割字节切片_Golang bytes切片分割方法  C++如何操作大型数据集_使用C++流式处理(Streaming)技术避免一次性加载大文件  b站怎么取消点赞_b站点赞取消操作方法  J*aScript Promise链中如何正确终止后续.then执行并处理错误  Win11怎么隐藏桌面图标 Win11一键隐藏所有桌面元素及恢复显示  Yandex官网搜索引擎免登录_俄罗斯Yandex一键直达入口  快手官方唯一登录入口 谨防山寨钓鱼网站  知乎APP怎么管理已购盐选内容_知乎APP盐选内容购买记录与查看方法  Safari浏览器输入栏卡顿如何解决 Safari搜索建议与缓存清理  深入理解J*aScript中的B样条曲线与节点向量生成 

搜索