设计模式之责任链模式

发布于:2025-09-13 ⋅ 阅读:(15) ⋅ 点赞:(0)

1.介绍

责任链模式 是一种行为型设计模式,它将多个处理器(Handler)对象串联成一条链,请求沿着链传递,直到某个处理器能够处理它为止。类图:

  • Handler(抽象处理者)

    • 定义处理请求的接口

    • 持有下一个处理者的引用(链式结构)

  • ConcreteHandler(具体处理者)

    • 实现处理逻辑

    • 如果不能处理请求,则将请求转发给下一个处理者

  • Client(客户端)

    • 创建责任链

    • 发起请求

2.责任链模式的优缺点

优点:

  • 请求发送者和处理者解耦

  • 动态组合和调整责任链,灵活性高

  • 满足 开闭原则(扩展新的处理器时无需修改已有代码)

缺点:

  • 调试不便,请求可能经过多次转发

  • 如果责任链过长,可能会影响性能

  • 不保证请求一定会被处理(可能所有处理者都放过了)

3.应用场景:日志处理系统

  • InfoHandler 处理 Info 日志

  • WarningHandler 处理 Warning 日志

  • ErrorHandler 处理 Error 日志

#include <iostream>
#include <string>
#include <memory>

// 抽象处理者
class Handler {
protected:
    std::shared_ptr<Handler> next;  // 下一个处理者

public:
    virtual ~Handler() = default;

    void setNext(std::shared_ptr<Handler> handler) {
        next = handler;
    }

    void handleRequest(const std::string& level, const std::string& message) {
        if (canHandle(level)) {
            process(message);
        } else if (next) {
            next->handleRequest(level, message);
        } else {
            std::cout << "No handler for: " << level << " -> " << message << "\n";
        }
    }

protected:
    virtual bool canHandle(const std::string& level) = 0;
    virtual void process(const std::string& message) = 0;
};

// 具体处理者:处理 Info
class InfoHandler : public Handler {
protected:
    bool canHandle(const std::string& level) override {
        return level == "INFO";
    }

    void process(const std::string& message) override {
        std::cout << "[INFO] " << message << "\n";
    }
};

// 具体处理者:处理 Warning
class WarningHandler : public Handler {
protected:
    bool canHandle(const std::string& level) override {
        return level == "WARNING";
    }

    void process(const std::string& message) override {
        std::cout << "[WARNING] " << message << "\n";
    }
};

// 具体处理者:处理 Error
class ErrorHandler : public Handler {
protected:
    bool canHandle(const std::string& level) override {
        return level == "ERROR";
    }

    void process(const std::string& message) override {
        std::cout << "[ERROR] " << message << "\n";
    }
};

// 客户端
int main() {
    // 构建责任链:Info -> Warning -> Error
    auto info = std::make_shared<InfoHandler>();
    auto warning = std::make_shared<WarningHandler>();
    auto error = std::make_shared<ErrorHandler>();

    info->setNext(warning);
    warning->setNext(error);

    // 测试
    info->handleRequest("INFO", "This is an info log");
    info->handleRequest("WARNING", "This is a warning log");
    info->handleRequest("ERROR", "This is an error log");
    info->handleRequest("DEBUG", "This is a debug log");  // 无人处理

    return 0;
}

运行结果:

-> % ./main
[INFO] This is an info log
[WARNING] This is a warning log
[ERROR] This is an error log
No handler for: DEBUG -> This is a debug log

🌟 常见应用场景:

  • 日志框架(日志级别过滤)

  • 权限控制(多级权限验证)

  • 异常处理机制(异常沿调用栈传递)

  • 事件处理(GUI 事件冒泡/捕获)

  • 中间件管道(Web 框架中的请求过滤链)