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

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

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

#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: 200

Validating authentication token...
Test2 Status: 401

Parsing request payload...
Generating response...
Test3 Status: 200

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

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

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

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

http://www.kler.cn/a/551554.html

相关文章:

  • 数据结构之BST、AVL、红黑树、哈夫曼树与B族树
  • leetcode:942. 增减字符串匹配(python3解法)
  • 23种设计模式 - 装饰器模式
  • 深度解析——Vue与React的核心差异
  • 解锁观察者模式:Java编程中的高效事件管理之道
  • FBD电插锁硬件,如何通过C++ 控制低电压高低电压实现控制开关锁,通过磁吸检查是否开门操作
  • 单纯禁用Cookie能否保证隐私安全?
  • 探秘 DeepSeek R1 模型:跨越多领域的科技奇迹,引领智能应用新浪潮
  • 视觉相关问题总结
  • 地表放置机场和飞机(十)
  • 深入内存调试:Valgrind工具的终极指南(转)
  • Oracle Rac 多路径链路不稳定引发IO降速-光弱
  • 关于使用雪花算法生成唯一ID,返回给前端ID不一致的问题
  • 内容中台重构企业内容管理流程驱动智能协作升级
  • 个人系统架构技术分享
  • 沃丰科技大模型标杆案例 | 索尼大模型智能营销机器人建设实践
  • 【笔记】LLM|Ubuntu22服务器极简本地部署DeepSeek+API使用方式
  • ubuntu下载和编译Android源码
  • SOME/IP--协议英文原文讲解6
  • UE5控件组件显示UMG文本不正常