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

C++开发之责任链模式

一、责任链模式概述

定义

责任链模式(Chain of Responsibility Pattern)是一种行为设计模式,它允许多个对象都有机会处理请求,从而避免请求发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递请求,直到有对象处理它为止。

核心思想

二、C++中的典型使用场景

场景1:事件处理系统(GUI框架)

同上;

场景2:日志系统(多级别日志)

// 示例:鼠标点击事件传递
class UIComponent {
protected:UIComponent* parent;
public:virtual bool handleClick(int x, int y) {if (parent) return parent->handleClick(x, y);return false;}
};class Button : public UIComponent {bool handleClick(int x, int y) override {if (isInside(x, y)) {onClick();return true;  // 处理完成}return UIComponent::handleClick(x, y);  // 传递给父组件}
};

场景3:异常处理(多层异常捕获)

class Logger {
protected:std::shared_ptr<Logger> next;LogLevel level;public:void setNext(std::shared_ptr<Logger> nextLogger) {next = nextLogger;}void log(LogLevel msgLevel, const std::string& msg) {if (msgLevel >= level) {write(msg);}if (next) {next->log(msgLevel, msg);}}virtual void write(const std::string& msg) = 0;
};class ConsoleLogger : public Logger {void write(const std::string& msg) override {std::cout << "[CONSOLE] " << msg << std::endl;}
};class FileLogger : public Logger {void write(const std::string& msg) override {// 写入文件}
};

场景4:权限验证(多级权限检查)

class ExceptionHandler {
protected:std::shared_ptr<ExceptionHandler> next;public:void setNext(std::shared_ptr<ExceptionHandler> handler) {next = handler;}virtual bool handle(const std::exception& e) {if (canHandle(e)) {process(e);return true;}if (next) return next->handle(e);return false;}virtual bool canHandle(const std::exception& e) = 0;virtual void process(const std::exception& e) = 0;
};

场景5:请求过滤器(Web中间件)

class AuthHandler {
protected:std::shared_ptr<AuthHandler> next;public:void setNext(std::shared_ptr<AuthHandler> handler) {next = handler;}bool authorize(const User& user, const Resource& resource) {if (check(user, resource)) {return true;}if (next) {return next->authorize(user, resource);}return false;}virtual bool check(const User& user, const Resource& resource) = 0;
};class AdminAuthHandler : public AuthHandler {bool check(const User& user, const Resource& resource) override {return user.role == Role::Admin;}
};class OwnerAuthHandler : public AuthHandler {bool check(const User& user, const Resource& resource) override {return resource.owner_id == user.id;}
};

场景6:功率调度系统(现有代码中的实例) ⭐

class RequestFilter {
protected:std::shared_ptr<RequestFilter> next;public:void setNext(std::shared_ptr<RequestFilter> filter) {next = filter;}virtual Response process(const Request& req) {// 前置处理preProcess(req);// 传递给下一个Response resp;if (next) {resp = next->process(req);}// 后置处理postProcess(resp);return resp;}virtual void preProcess(const Request& req) = 0;virtual void postProcess(Response& resp) = 0;
};

三、如何使用责任链模式

实现方式1:链式传递(现有代码使用的方式)

// 现有代码中的责任链实现
class Strategy {
protected:std::shared_ptr<Strategy> _next_successor;public:void SetNextSuccessor(const std::shared_ptr<Strategy>& successor) {_next_successor = successor;}virtual void RunStrategy() = 0;  // 纯虚函数
};

实现方式2:返回值控制(更灵活)

// 基类
class Strategy {
protected:std::shared_ptr<Strategy> _next_successor;public:void SetNextSuccessor(const std::shared_ptr<Strategy>& successor) {_next_successor = successor;}virtual void RunStrategy() = 0;
};// 具体处理器1
class AddPQDischarge : public Strategy {
public:void RunStrategy() override {// 判断是否能处理if (can_handle_by_pq_discharge()) {// 处理逻辑execute_pq_discharge();} else {// 传递给下一个if (_next_successor) {_next_successor->RunStrategy();}}}private:bool can_handle_by_pq_discharge() {return !(*pv_p_up + *charging_ev_p_down + *discharging_ev_p_up + *pq_bat_p_up + *load_p + *vf_bat_p_eco > 0);}void execute_pq_discharge() {*pv_p_set = *pv_p_up;*pq_bat_p_set = calculate_discharge_power();// ... 其他设置}
};// 具体处理器2
class ReduceEvCharge : public Strategy {
public:void RunStrategy() override {// 直接处理,不再传递execute_reduce_ev_charge();}private:void execute_reduce_ev_charge() {*charging_ev_p_set = calculate_reduced_charge();*limit_charging_ev = 1;// ... 其他设置}
};// 使用方式
void setup_chain() {auto handler1 = std::make_shared<AddPQDischarge>();auto handler2 = std::make_shared<ReduceEvCharge>();// 建立链条handler1->SetNextSuccessor(handler2);// 启动处理handler1->RunStrategy();
}

实现方式3:中间件模式(双向处理)

class Handler {
protected:std::shared_ptr<Handler> next;public:void setNext(std::shared_ptr<Handler> nextHandler) {next = nextHandler;}// 返回true表示已处理,false表示未处理bool handle(const Request& req) {if (canHandle(req)) {process(req);return true;  // 处理成功,停止链}// 传递给下一个if (next) {return next->handle(req);}return false;  // 链末端仍未处理}virtual bool canHandle(const Request& req) = 0;virtual void process(const Request& req) = 0;
};

四、现有代码中的责任链实例分析

代码结构

构建链条

class Middleware {
protected:std::shared_ptr<Middleware> next;public:void setNext(std::shared_ptr<Middleware> middleware) {next = middleware;}Response execute(const Request& req) {// 前置处理before(req);// 调用下一个Response resp;if (next) {resp = next->execute(req);} else {resp = defaultResponse(req);}// 后置处理after(resp);return resp;}virtual void before(const Request& req) = 0;virtual void after(Response& resp) = 0;virtual Response defaultResponse(const Request& req) = 0;
};

使用链条

graph LRsubgraph "功率过剩链"A1[AddPQDischarge] -->|无法处理| A2[ReduceEvCharge]endsubgraph "功率不足链"B1[AddPQCharge] -->|无法处理| B2[ReduceEvDischarge]B2 -->|无法处理| B3[ReducePv]endsubgraph "功率平衡"C1[VFRunEco]endEntry[OffgridSTC] --> Decision{功率判断}Decision -->|过剩| A1Decision -->|平衡| C1Decision -->|不足| B1style A1 fill:#FFE4B5style A2 fill:#FFCCBCstyle B1 fill:#E4F5FFstyle B2 fill:#C8E6FFstyle B3 fill:#B2DFDB

链内传递

		_addpqdischarge_ptr->SetNextSuccessor(_reduceevcharge_ptr);_addpqcharge_ptr->SetNextSuccessor(_reduceevdischarge_ptr);_reduceevdischarge_ptr->SetNextSuccessor(_reducepv_ptr);

五、责任链模式 vs 其他模式

对比表格

特性责任链模式策略模式状态模式命令模式
目的解耦请求发送者和接收者封装算法族封装状态转换封装请求为对象
结构链式结构平行结构状态图结构命令队列
选择方式自动传递客户端选择状态驱动调用者执行
扩展性⭐⭐⭐⭐⭐ 优秀⭐⭐⭐⭐ 良好⭐⭐⭐ 一般⭐⭐⭐⭐ 良好
复杂度⭐⭐⭐ 中等⭐⭐ 简单⭐⭐⭐⭐ 较复杂⭐⭐⭐ 中等
运行时修改✅ 可以✅ 可以✅ 可以✅ 可以
处理顺序固定链式单一选择状态转换队列顺序

http://www.dtcms.com/a/525318.html

相关文章:

  • JVM面试(内存结构,垃圾回收,类载机制)
  • 并发编程案例分析——高性能限流器Guava RateLimiter(四十六)
  • 灵巧手——faive_gym
  • 亚马逊电子配件类目流量瓶颈突破:DeepBI智能优化策略助力流量增长
  • 桂市做网站的朋友自建电商网站有哪些
  • autoware源码编译
  • react nextjs 项目部署
  • 怎样建设网站 需要哪些条件免费的免抠图素材网站
  • FPGA学习笔记——用Vitis IDE生成工程(串口发送)
  • 烟台 o2o平台带动做网站行业平潭综合实验区交通与建设网站
  • GaussianShader
  • 昆山企业做网站好用的网站系统
  • javaScript事件委托
  • 广州营销型网站建设哪家好公司域名怎么起
  • 28.C++的IO流
  • 车载基础软件——基础软件验证平台典型案例(通信相关)
  • 【FPGA】设计流程——板级验证
  • 1Panel-1Panel中openresty网站目录更改为宿主机共享目录
  • 分支和循环语句
  • 自己做网站买株洲平台公司有几家
  • 2.2softmax回归
  • EtherCAT转PROFINET网关在饲料厂自动化系统整合中的关键作用
  • 公司网站建设泉州福田住房和建设局官网
  • 2018建设网站企业网站页脚信息
  • 【Frida Android】基础篇12:Native层hook基础——调用原生函数
  • gitlab上传新仓库,保留原仓库提交记录,原仓库远程地址已经失效,只有本机还有提交记录
  • wordpress最新文章加图标怎么做好网站搜索引擎优化
  • 操作系统 | Linux:第四章 Linux的实用操作
  • 数学概念 复习自用
  • 深圳做h5网站制作ui设计培训是什么