全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

c++如何实现责任链模式 c++设计模式之Chain of Responsibility【实例】

责任链模式通过将请求发送者与接收者解耦,使多个对象有机会处理请求,形成一条由抽象基类Handler定义统一接口、具体处理器继承实现的处理链;示例中组长、经理、总监按金额逐级审批,支持动态扩展与健壮性优化。

责任链模式(Chain of Responsibility)在 C++ 中通过将请求的发送者与接收者解耦,让多个对象都有机会处理该请求,形成一条处理对象的链。每个处理者持有一个指向下一个处理者的指针(或引用),若自身不能处理,就将请求传递给下一个节点。

核心结构设计

典型实现包含一个抽象处理者基类(Handler),定义统一的处理接口和对后继的引用;若干具体处理者(ConcreteHandler)继承并实现自己的处理逻辑。

  • 基类通常含纯虚函数 handleRequest(),返回 bool 表示是否已处理
  • setNext() 或构造时传入方式设置后继,避免硬编码依赖
  • 链的末端可设为 nullptr,处理到末尾未匹配时默认不作响应(或抛异常/记录日志)

简单可运行示例

模拟审批流程:不同金额由不同角色审批(组长 ≤ 1000,经理 ≤ 5000,总监无上限):

class Handler {
protected:
    Handler* next_ = nullptr;
public:
    void setNext(Handler* next) { next_ = next; }
    virtual bool handle(int amount) = 0;
    virtual ~Handler() = default;
};

class TeamLeader : public Handler { public: bool handle(int amount) override { if (amount <= 1000) { std::cout << "组长批准:" << amount << "元\n"; return true; } if (next) return next->handle(amount); return false; } };

class Manager : public Handler { public: bool handle(int amount) override { if (amount <= 5000) { std::cout << "经理批准:" << amount << "元\n"; return true; } if (next) return next->handle(amount); return false; } };

class Director : public Handler { public: bool handle(int amount) override { std::cout << "总监批准:" << amount << "元(无额度限制)\n"; return true; } };

// 使用: int main() { TeamLeader tl; Manager mg; Director dr;

tl.setNext(&mg);
mg.setNext(&dr);

tl.handle(500);   // 组长批准
tl.handle(3000);  // 经理批准
tl.handle(10000); // 总监批准

}

增强实践建议

真实项目中可进一步优化健壮性和扩展性:

  • std::unique_ptr 管理链节点生命周期,避免裸指针悬挂
  • 支持动态插拔:提供 addHandler() 方法构建链,而非手动 setNext
  • 加入日志或拦截逻辑:在基类 handle() 中统一记录进入/退出,便于调试
  • 处理结果可返回枚举(HANDLED / REJECTED / PASSED)比 bool 更清晰

适用场景与注意点

适合多级审核、事件分发、过滤器链(如 HTTP 中间件)、GUI 事件冒泡等场景。

  • 避免链过长导致性能下降;必要时加最大跳转深度保护
  • 确保至少有一个处理器能兜底,否则请求可能静默丢失
  • 链的构建顺序影响行为,初始化时需明确职责边界,防止重叠或遗漏


# 处理器  # 编码  # 事件冒泡  # ai  # c++  # 中间件  # bool  # 指针  # 继承  # 虚函数  # 纯虚函数  # 接口  # 对象  # 事件  # http  # 多个  # 自己的  # 中统  # 都有  # 设为  # 有机会  # 健壮性  # 跳转  # 就将  # 而非 


相关文章: 高端建站如何打造兼具美学与转化的品牌官网?  建站之星在线版空间:自助建站+智能模板一键生成方案  深圳网站制作平台,深圳市做网站好的公司有哪些?  武汉外贸网站制作公司,现在武汉外贸前景怎么样啊?  制作旅游网站html,怎样注册旅游网站?  如何快速生成凡客建站的专业级图册?  如何快速上传自定义模板至建站之星?  南京做网站制作公司,南京哈发网络有限公司,公司怎么样,做网页美工DIV+CSS待遇怎么样?  如何通过宝塔面板实现本地网站访问?  微信小程序 五星评分(包括半颗星评分)实例代码  电商网站制作公司有哪些,1688网是什么意思?  个人摄影网站制作流程,摄影爱好者都去什么网站?  建站三合一如何选?哪家性价比更高?  网站制作报价单模板图片,小松挖机官方网站报价?  如何在Ubuntu系统下快速搭建WordPress个人网站?  专业商城网站制作公司有哪些,pi商城官网是哪个?  如何在服务器上三步完成建站并提升流量?  如何通过服务器快速搭建网站?完整步骤解析  长沙做网站要多少钱,长沙国安网络怎么样?  如何快速完成中国万网建站详细流程?  javascript基本数据类型及类型检测常用方法小结  建站主机系统SEO优化与智能配置核心关键词操作指南  盐城做公司网站,江苏电子版退休证办理流程?  常州自助建站:操作简便模板丰富,企业个人快速搭建网站  建站之星价格显示格式升级,你的预算足够吗?  如何在IIS7上新建站点并设置安全权限?  购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?  ,如何利用word制作宣传手册?  如何在阿里云购买域名并搭建网站?  如何挑选最适合建站的高性能VPS主机?  网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?  西安大型网站制作公司,西安招聘网站最好的是哪个?  香港服务器租用每月最低只需15元?  高防服务器如何保障网站安全无虞?  如何通过智能用户系统一键生成高效建站方案?  合肥做个网站多少钱,合肥本地有没有比较靠谱的交友平台?  网站网页制作电话怎么打,怎样安装和使用钉钉软件免费打电话?  太原网站制作公司有哪些,网约车营运证查询官网?  商务网站制作工程师,从哪几个方面把握电子商务网站主页和页面的特色设计?  制作网站的软件免费下载,免费制作app哪个平台好?  网站制作软件有哪些,制图软件有哪些?  如何在VPS电脑上快速搭建网站?  宝盒自助建站智能生成技巧:SEO优化与关键词设置指南  企业微网站怎么做,公司网站和公众号有什么区别?  香港服务器选型指南:免备案配置与高效建站方案解析  家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?  小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?  网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?  单页制作网站有哪些,朋友给我发了一个单页网站,我应该怎么修改才能把他变成自己的呢,请求高手指点迷津?  如何通过IIS搭建网站并配置访问权限? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。