新闻中心
C++怎么实现一个责任链模式_C++设计模式与责任链模式实现
责任链模式通过请求在处理者链中传递实现解耦,C++中以抽象Handler定义接口,具体处理者继承并决定处理或转发请求,示例中主管、经理、总监按金额逐级审批,使用智能指针管理生命周期,支持动态构建链与多级处理,适用于审批流等场景。

责任链模式(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&q
uot;;
} else {
std::cout << name << " cannot handle $" << amount << ", escalating...\n";
passToNext(amount);
}
}
};
使用示例:
Perplexity
Perplexity是一个ChatGPT和谷歌结合的超级工具,可以让你在浏览互联网时提出问题或获得即时摘要
302
查看详情
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样条曲线与节点向量生成


2025-11-12
浏览次数:次
返回列表
uot;;
} else {
std::cout << name << " cannot handle $" << amount << ", escalating...\n";
passToNext(amount);
}
}
};