C++ 设计模式-责任链模式

news/2025/2/21 13:01:05/

模拟网络请求处理管道,包含动态处理器注册、请求修改和条件传递等特性:

#include <iostream>
#include <memory>
#include <vector>
#include <string>// 请求上下文,包含可修改的状态
struct RequestContext {std::string headers;std::string body;bool processed = false;int statusCode = 0;
};// 抽象处理器接口
class RequestHandler {
public:virtual ~RequestHandler() = default;virtual void handle(RequestContext& context) = 0;virtual bool canHandle(const RequestContext& context) const = 0;
};// 处理器链管理器
class ProcessingPipeline {std::vector<std::unique_ptr<RequestHandler>> handlers_;std::unique_ptr<RequestHandler> fallback_;public:void addHandler(std::unique_ptr<RequestHandler> handler) {handlers_.emplace_back(std::move(handler));}void setFallbackHandler(std::unique_ptr<RequestHandler> handler) {fallback_ = std::move(handler);}void execute(RequestContext& context) {for (auto& handler : handlers_) {if (handler->canHandle(context)) {handler->handle(context);if (context.processed) return;}}if (fallback_) {fallback_->handle(context);} else {std::cerr << "No handler available for request\n";context.statusCode = 500;}}
};// 具体处理器:认证验证
class AuthenticationHandler : public RequestHandler {bool canHandle(const RequestContext& context) const override {return context.headers.find("Authorization") != std::string::npos;}void handle(RequestContext& context) override {std::cout << "Validating authentication token...\n";// 模拟验证逻辑if (context.headers.find("Bearer valid") != std::string::npos) {std::cout << "Authentication successful\n";} else {context.statusCode = 401;context.processed = true;}}
};// 具体处理器:负载解析
class PayloadParserHandler : public RequestHandler {bool canHandle(const RequestContext& context) const override {return !context.body.empty() && context.statusCode == 0;}void handle(RequestContext& context) override {std::cout << "Parsing request payload...\n";// 解析逻辑...context.headers += "\nContent-Type: application/json";}
};// 具体处理器:响应生成
class ResponseGeneratorHandler : public RequestHandler {bool canHandle(const RequestContext& context) const override {return context.statusCode == 0 && !context.body.empty();}void handle(RequestContext& context) override {std::cout << "Generating response...\n";context.statusCode = 200;context.processed = true;}
};// 回退处理器
class FallbackHandler : public RequestHandler {bool canHandle(const RequestContext&) const override { return true; }void handle(RequestContext& context) override {context.statusCode = 404;context.processed = true;std::cout << "No suitable handler found\n";}
};int main() {ProcessingPipeline pipeline;pipeline.addHandler(std::make_unique<AuthenticationHandler>());pipeline.addHandler(std::make_unique<PayloadParserHandler>());pipeline.addHandler(std::make_unique<ResponseGeneratorHandler>());pipeline.setFallbackHandler(std::make_unique<FallbackHandler>());// 测试用例1:有效请求{RequestContext validRequest;validRequest.headers = "Authorization: Bearer valid";validRequest.body = R"({"data":"example"})";pipeline.execute(validRequest);std::cout << "Test1 Status: " << validRequest.statusCode << "\n\n";}// 测试用例2:无效认证{RequestContext invalidAuth;invalidAuth.headers = "Authorization: Bearer invalid";pipeline.execute(invalidAuth);std::cout << "Test2 Status: " << invalidAuth.statusCode << "\n\n";}// 测试用例3:未知请求类型{RequestContext unknownRequest;unknownRequest.body = "unstructured data";pipeline.execute(unknownRequest);std::cout << "Test3 Status: " << unknownRequest.statusCode << "\n";}return 0;
}

该实现包含以下高级特性:

  1. 智能处理器选择
  • 每个处理器通过canHandle方法声明处理能力
  • 处理器链自动选择符合条件的处理器执行
  • 支持提前终止处理流程(通过context.processed标志)
  1. 动态管道管理
  • 使用ProcessingPipeline类管理处理器生命周期
  • 支持运行时动态添加处理器
  • 提供回退处理器处理未匹配情况
  1. 上下文状态管理
  • RequestContext携带处理状态并在处理器间传递
  • 处理器可以修改上下文内容(如添加headers)
  • 状态码和processed标志控制流程走向
  1. 多重处理策略
  • 认证处理器执行验证并可能终止流程
  • 负载处理器执行数据转换
  • 响应生成器处理成功案例
  • 回退处理器处理边缘情况
  1. 扩展性设计
  • 符合开闭原则(新增处理器无需修改现有代码)
  • 处理器之间完全解耦
  • 支持多种组合方式和执行策略

示例输出:

Validating authentication token...
Authentication successful
Parsing request payload...
Generating response...
Test1 Status: 200Validating authentication token...
Test2 Status: 401Parsing request payload...
Generating response...
Test3 Status: 200

该实现展示了责任链模式在以下场景的适用性:

  • 需要动态处理顺序的请求管道
  • 复杂的分支处理逻辑
  • 需要灵活组合处理组件的系统
  • 需要渐进式请求处理的Web中间件
  • 业务规则复杂的审批系统

通过这种设计,可以轻松实现以下扩展:

  1. 添加新的处理器类型(如日志记录、缓存处理)
  2. 实现处理器优先级系统
  3. 添加异步处理支持
  4. 实现处理器性能监控
  5. 支持条件分支管道

http://www.ppmy.cn/news/1573890.html

相关文章

排序算法复习——包括插入排序、希尔排序、冒泡排序、快排(包括霍尔法、挖坑法、快慢指针法)、堆排、选择排序、归并排序等 (代码采用c/c++混编)

1.插入排序 插入排序就像我们打斗地主的时候&#xff0c;有一大把牌我们来不及理&#xff0c;就会一张一张的拿然后把拿到的牌放到合适的位置。 对于插入排序我们可以将待排序的数组理解为那一堆没有整理的牌&#xff0c;将排序好的部分理解为手上的牌&#xff0c;对于第i张牌我…

Pycharm安装教程超详细图文教程,超详细Pycharm安装保姆级教程

文章目录 前言一、环境搭建1. 下载 PyCharm2. 下载 Python3. 安装 Python4. pycharm安装教程 总结 前言 在 Python 编程的广阔天地里&#xff0c;拥有一款强大且称手的集成开发环境&#xff08;IDE&#xff09;至关重要。PyCharm 作为 JetBrains 公司推出的一款专业 Python ID…

Docker Desktop 入门教学

引言 Docker Desktop 是 Docker 官方为开发者提供的桌面应用程序&#xff0c;支持在 Windows 和 macOS 上轻松构建、运行和共享容器化应用程序。它集成了 Docker 引擎、Docker CLI 客户端以及 Docker Compose 等工具&#xff0c;方便您在本地开发和测试。 一、快速安装 1. 系…

网络协议相关知识有哪些?

前言 网络协议的基础是OSI和TCP/IP模型,这两个模型是理解协议分层的关键。 正文(仅是个人理解,如有遗漏望海涵) 网络协议是网络中设备间通信的规则和标准,涉及数据传输、路由、错误控制等多个方面。以下是网络协议相关知识的系统梳理: 一、网络协议分层模型 1、OSI七…

Linux----Makefile基础

Makefile 是自动化构建工具 make 的配置文件&#xff0c;用于定义编译规则和依赖关系&#xff0c;实现高效增量编译。 初识makefile 1. 什么是 make&#xff1f; 定义&#xff1a; make 是一个命令行工具&#xff08;可执行程序&#xff09;&#xff0c;用于解析并执行 Makef…

正则表达式(Regular expresssion)

正则表达式 匹配单次 . &#xff1a;匹配任意一个字符 [ ] &#xff1a;匹配[ ]里举例的任意一个字符 /d &#xff1a;匹配数字0-9 /D &#xff1a;匹配非数字 /s &#xff1a;匹配空白或tab建 /S &#xff1a;匹配非空白 /w &#xff1a;…

Excel 表格和 Node.js 实现数据转换工具

这个工具的核心思路是&#xff1a; 前端&#xff1a;使用 SheetJS (xlsx) 解析和导出 Excel 数据&#xff0c;并提供 UI 进行增删改查。后端 (Node.js Express)&#xff1a;处理 Excel 数据的转换、存储&#xff0c;并提供 API 接口。 1. 安装依赖 在前端和后端项目分别安装…

数据中心基础设施绿色建维服务认证专业团队认监委备案

在“双碳”目标的引领下&#xff0c;数据中心行业正朝着绿色低碳的方向加速转型。作为数据中心稳定运行的基石&#xff0c;基础设施的绿色运维至关重要。而数据中心基础设施绿色建维服务认证&#xff0c;正是为数据中心运营商和服务提供商量身打造的绿色运维能力“试金石”。 …