1. 责任链模式概述
责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,它允许你将请求沿着处理者链进行传递,直到有一个处理者能够处理它为止。这种模式解耦了请求的发送者和接收者,使得多个对象都有机会处理请求。
在《Head First设计模式》一书中,责任链模式被形象地比喻为"热土豆"游戏——请求就像一颗热土豆,在对象链中传递,直到有对象愿意处理它。这种模式特别适合处理以下场景:
- 有多个对象可以处理同一个请求,但具体由哪个对象处理需要在运行时动态决定
- 需要在不明确指定接收者的情况下,向多个对象中的一个提交请求
- 可动态指定一组对象处理请求
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 责任链模式的核心结构
2.1 UML类图解析
典型的责任链模式包含以下几个关键角色:
-
Handler(抽象处理者):
- 定义处理请求的接口
- 通常包含一个指向下一个处理者的引用
- 可以实现在后继者之间的默认传递逻辑
-
ConcreteHandler(具体处理者):
- 实现具体的请求处理方法
- 能够处理请求则处理,否则将请求转发给后继者
- 每个处理者通常有自己的处理条件
-
Client(客户端):
- 创建处理链
- 向链头的处理者提交请求
2.2 C++实现要点
在C++中实现责任链模式时,有几个关键点需要注意:
-
链的构建方式:
- 可以在客户端代码中显式构建
- 也可以通过配置文件动态构建
- 链的顺序通常反映了处理的优先级
-
请求的传递:
- 通过基类的指针或引用实现多态调用
- 可以使用智能指针管理处理者对象的生命周期
- 请求对象通常需要包含足够的上下文信息
-
终止条件:
- 明确处理链的终点(如最后一个处理者不设置后继)
- 可以考虑设置默认处理者处理"未处理"的情况
3. 责任链模式的C++实现示例
3.1 基础实现代码
cpp复制#include <iostream>
#include <memory>
#include <string>
// 请求类
class Request {
public:
Request(int level, const std::string& content)
: level_(level), content_(content) {}
int getLevel() const { return level_; }
std::string getContent() const { return content_; }
private:
int level_;
std::string content_;
};
// 抽象处理者
class Handler {
public:
virtual ~Handler() = default;
void setNext(std::shared_ptr<Handler> next) {
next_ = next;
}
virtual void handleRequest(const Request& req) = 0;
protected:
std::shared_ptr<Handler> next_;
};
// 具体处理者A
class ConcreteHandlerA : public Handler {
public:
void handleRequest(const Request& req) override {
if (req.getLevel() <= 1) {
std::cout << "HandlerA处理请求: " << req.getContent() << std::endl;
} else if (next_) {
next_->handleRequest(req);
} else {
std::cout << "请求未被处理: " << req.getContent() << std::endl;
}
}
};
// 具体处理者B
class ConcreteHandlerB : public Handler {
public:
void handleRequest(const Request& req) override {
if (req.getLevel() <= 2) {
std::cout << "HandlerB处理请求: " << req.getContent() << std::endl;
} else if (next_) {
next_->handleRequest(req);
} else {
std::cout << "请求未被处理: " << req.getContent() << std::endl;
}
}
};
// 客户端代码
int main() {
auto handlerA = std::make_shared<ConcreteHandlerA>();
auto handlerB = std::make_shared<ConcreteHandlerB>();
handlerA->setNext(handlerB);
Request req1(1, "低级请求");
Request req2(2, "中级请求");
Request req3(3, "高级请求");
handlerA->handleRequest(req1);
handlerA->handleRequest(req2);
handlerA->handleRequest(req3);
return 0;
}
3.2 代码解析与优化
-
智能指针的使用:
- 使用
std::shared_ptr管理处理者对象的生命周期 - 避免了手动内存管理的复杂性
- 确保链中的对象能够正确释放
- 使用
-
请求类的设计:
- 包含处理级别和内容信息
- 可以根据需要扩展更多属性
- 提供了简单的访问接口
-
处理逻辑的优化:
- 每个处理者只处理特定级别的请求
- 未处理的请求自动传递给下一个处理者
- 链尾处理未处理请求的情况
4. 责任链模式的进阶应用
4.1 动态链配置
在实际应用中,处理链的配
