【设计模式】责任链
【设计模式】责任链
在实际开发中,我们经常遇到这样的需求:某个请求需要经过多个处理者,但处理的顺序、方式可能会变化或扩展。这时候,责任链模式就能派上用场。
责任链模式(Chain of Responsibility) 是一种行为型设计模式,它允许将多个对象连成一条链,沿着这条链传递请求,直到有对象处理它为止。
✅ 适用场景:
- 一个请求有多个处理对象,但处理者不明确。
- 请求处理者之间存在递进或条件处理关系。
- 需要动态添加/修改处理者。
🧱 模式结构
责任链的典型结构如下图所示:
Client --> Handler1 --> Handler2 --> Handler3
每个 Handler 决定:
- 是否处理请求;
- 是否传递给下一个处理者。
🔧 责任链模式的组成
角色 | 作用 |
---|---|
Handler(抽象处理者) | 定义处理请求的接口,并持有下一个处理者的引用。 |
ConcreteHandler(具体处理者) | 实现请求的处理逻辑。可以处理请求,也可以将请求传递下去。 |
Client(客户端) | 构建责任链并发送请求。 |
🧑💻 C++ 示例:日志处理系统
下面是一个日志处理系统的例子,有 DEBUG
、INFO
、ERROR
三种日志等级。每个日志处理器处理它关心的级别,其它的交给链上的下一个处理器。
#include <iostream>
#include <memory>
#include <string>enum LogLevel { DEBUG, INFO, ERROR };// 抽象处理器
class Logger {
protected:std::shared_ptr<Logger> next;
public:void setNext(std::shared_ptr<Logger> nextLogger) {next = nextLogger;}virtual void logMessage(LogLevel level, const std::string& message) = 0;virtual ~Logger() = default;
};// 具体处理器:DEBUG
class DebugLogger : public Logger {
public:void logMessage(LogLevel level, const std::string& message) override {if (level == DEBUG) {std::cout << "[DEBUG] " << message << std::endl;} else if (next) {next->logMessage(level, message);}}
};// 具体处理器:INFO
class InfoLogger : public Logger {
public:void logMessage(LogLevel level, const std::string& message) override {if (level == INFO) {std::cout << "[INFO] " << message << std::endl;} else if (next) {next->logMessage(level, message);}}
};// 具体处理器:ERROR
class ErrorLogger : public Logger {
public:void logMessage(LogLevel level, const std::string& message) override {if (level == ERROR) {std::cout << "[ERROR] " << message << std::endl;} else if (next) {next->logMessage(level, message);}}
};// 客户端代码
int main() {auto debugLogger = std::make_shared<DebugLogger>();auto infoLogger = std::make_shared<InfoLogger>();auto errorLogger = std::make_shared<ErrorLogger>();// 构建责任链:DEBUG -> INFO -> ERRORdebugLogger->setNext(infoLogger);infoLogger->setNext(errorLogger);debugLogger->logMessage(INFO, "This is an information.");debugLogger->logMessage(DEBUG, "This is a debug message.");debugLogger->logMessage(ERROR, "This is an error message.");return 0;
}
🧾 输出:
[INFO] This is an information.
[DEBUG] This is a debug message.
[ERROR] This is an error message.
✅ 优点与缺点
👍 优点:
- 降低耦合:发送者不需要知道接收者是谁。
- 动态组合处理顺序,灵活扩展处理流程。
- 符合开闭原则(新增处理器不需修改已有代码)。
👎 缺点:
- 可能导致请求不被处理(如果链末端没有默认处理器)。
- 调试链路时不易追踪每一步处理。
🧭 应用实例
- UI 事件传播(如按钮点击事件)。
- 审批流程(如财务报销:主管 -> 经理 -> 财务总监)。
- Java 中的 Servlet Filter 链。
- 中间件处理管道(如 ASP.NET Core 中的 Middleware)。
🔚 总结
责任链模式是一种非常实用的行为型设计模式,在事件处理、权限控制、审批流程等场景中发挥着重要作用。