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 框架中的请求过滤链)