当前位置: 首页 > news >正文

职责链模式应用场景与C++实现

1. 职责链模式核心思想
定义:使多个对象都有机会处理请求,从而避免请求发送者与接收者耦合。将这些对象连成一条链,并沿着链传递请求直到被处理。

核心组件:

Handler:定义处理请求的接口,包含设置后继者的方法

ConcreteHandler:具体处理器,实现处理逻辑或转发请求

Client:创建处理链并向链头发送请求

特点:

动态组合处理流程

请求者无需知道具体处理者

支持运行时链结构调整

2. 5个经典应用场景
① 多级日志过滤系统
不同级别日志(DEBUG/INFO/WARN/ERROR)由不同处理器处理,未处理日志最终交给默认处理器。

② 电商订单处理流程
订单依次通过:库存检查→支付验证→风控审核→物流分配等环节,任一环节失败则终止。

③ 游戏事件处理
游戏中的输入事件(点击/键盘/手柄)按优先级链传递,直到被某个游戏对象响应。

④ 网络请求中间件
HTTP请求经过:身份认证→权限校验→限流控制→业务处理等中间件链。

⑤ 异常处理系统
异常依次尝试:本地恢复→备用方案→日志记录→上级系统通知。

3. C++实现示例
场景模拟:公司采购审批系统
基层经理:可审批≤5000元的采购

部门总监:可审批≤20000元的采购

CFO:可审批≤100000元的采购

董事会:处理超过100000元的采购

#include <iostream>
#include <string>// 请求类
class PurchaseRequest {
public:PurchaseRequest(double amount, const std::string& purpose) : amount_(amount), purpose_(purpose) {}double getAmount() const { return amount_; }const std::string& getPurpose() const { return purpose_; }private:double amount_;std::string purpose_;
};// 抽象处理器
class Approver {
public:explicit Approver(const std::string& name) : name_(name), successor_(nullptr) {}void setSuccessor(Approver* successor) {successor_ = successor;}virtual void processRequest(const PurchaseRequest& request) = 0;protected:std::string name_;Approver* successor_;  // 后继处理者
};// 具体处理器:经理
class Manager : public Approver {
public:explicit Manager(const std::string& name) : Approver(name) {}void processRequest(const PurchaseRequest& request) override {if (request.getAmount() <= 5000) {std::cout << "经理" << name_ << "审批采购单:"<< request.getAmount() << "元,目的:" << request.getPurpose() << std::endl;} else if (successor_ != nullptr) {successor_->processRequest(request);}}
};// 具体处理器:总监
class Director : public Approver {
public:explicit Director(const std::string& name) : Approver(name) {}void processRequest(const PurchaseRequest& request) override {if (request.getAmount() <= 20000) {std::cout << "总监" << name_ << "审批采购单:"<< request.getAmount() << "元,目的:" << request.getPurpose() << std::endl;} else if (successor_ != nullptr) {successor_->processRequest(request);}}
};// 具体处理器:CFO
class CFO : public Approver {
public:explicit CFO(const std::string& name) : Approver(name) {}void processRequest(const PurchaseRequest& request) override {if (request.getAmount() <= 100000) {std::cout << "CFO " << name_ << "审批采购单:"<< request.getAmount() << "元,目的:" << request.getPurpose() << std::endl;} else if (successor_ != nullptr) {successor_->processRequest(request);}}
};// 具体处理器:董事会
class Board : public Approver {
public:explicit Board(const std::string& name) : Approver(name) {}void processRequest(const PurchaseRequest& request) override {std::cout << "董事会" << name_ << "审批重大采购单:"<< request.getAmount() << "元,目的:" << request.getPurpose() << std::endl;}
};int main() {// 构建责任链Manager manager("张经理");Director director("李总监");CFO cfo("王财务");Board board("全体董事");manager.setSuccessor(&director);director.setSuccessor(&cfo);cfo.setSuccessor(&board);// 模拟采购请求PurchaseRequest req1(4500, "购买办公用品");PurchaseRequest req2(15000, "团队建设活动");PurchaseRequest req3(80000, "服务器升级");PurchaseRequest req4(150000, "新建数据中心");// 处理请求(均从链头开始)manager.processRequest(req1);manager.processRequest(req2);manager.processRequest(req3);manager.processRequest(req4);return 0;
}
输出结果
经理张经理审批采购单:4500元,目的:购买办公用品
总监李总监审批采购单:15000元,目的:团队建设活动
CFO 王财务审批采购单:80000元,目的:服务器升级
董事会全体董事审批重大采购单:150000元,目的:新建数据中心

4. 模式变体与优化

(1)功能增强版
// 支持中断传递的增强版处理器接口
class EnhancedApprover : public Approver {
public:virtual bool canHandle(const PurchaseRequest& request) const = 0;void processRequest(const PurchaseRequest& request) override {if (canHandle(request)) {// 处理逻辑...} else if (successor_) {successor_->processRequest(request);} else {std::cerr << "无法处理的请求:" << request.getPurpose() << std::endl;}}
};

(2)模板化实现

template<typename T>
class HandlerChain {
public:void addHandler(std::shared_ptr<T> handler) {if (!head_) {head_ = handler;tail_ = handler;} else {tail_->setNext(handler);tail_ = handler;}}void handle(const typename T::RequestType& req) {if (head_) head_->handle(req);}private:std::shared_ptr<T> head_;std::shared_ptr<T> tail_;
};

5. 工程实践建议
链的构建:推荐使用工厂模式或依赖注入构建责任链

性能优化:对于长链可引入缓存机制(如记录上次处理节点)

监控增强:添加链调用日志,便于调试复杂流程

与其它模式结合:

组合模式:构建树形处理结构

策略模式:动态更换处理算法

命令模式:将请求对象化

职责链模式特别适用于需要动态调整处理流程的场景,是解耦请求发送者和处理者的经典解决方案。

http://www.lryc.cn/news/613615.html

相关文章:

  • 前端开发工具大全
  • 大疆前端笔试题目详解
  • PostgreSQL 强制索引:当重复数据让优化器“失明”时的解决方案
  • 实验室课程|基于SprinBoot+vue的实验室课程管理系统(源码+数据库+文档)
  • vue3 el-select 加载内容后 触发事件
  • Mysql自定义顺序查询
  • Mysql 单行函数 聚合函数
  • 六类注定烂尾的甲方软件外包必看!这类甲方不要理-优雅草卓伊凡
  • sigprocmask 函数深度解析
  • 【指南版】网络与信息安全岗位系列(三):安全运维工程师
  • Redis 分布式Session
  • Redis面试精讲 Day 16:Redis性能监控与分析工具
  • 锡膏种类多,不同的锡膏有什么区别,该如何正确选择?
  • 深入理解 ReentrantLock和AQS底层源码
  • Day09 Tlisa登录认证
  • 计算机英语详细总结
  • 类和对象(中):类的默认成员函数、构造函数、析构函数
  • MinHash算法:为什么选择Min而不是Max
  • DM数据库集群操作顺序规范
  • Linux线程学习
  • 分布式面经
  • Redis面试精讲 Day 14:Redis分片策略与一致性Hash
  • Debain12 api方式部署redis服务
  • 51c大模型~合集165
  • Tiger任务管理系统-10
  • Java 中 Object 类的解析:知识点与注意事项
  • 每日五个pyecharts可视化图表-bars(6)
  • [激光原理与应用-170]:测量仪器 - 能量型 - 光功率计的工作原理与内部功能模块组成
  • 语言模型(LM):n-gram模型原理与困惑度(Perplexity)计算详解
  • 快速搭建vue3+flask实现一个异物检测项目