职责链模式通过抽象基类定义处理接口,使用智能指针连接具体处理者,使请求沿链传递直至被处理或终止,实现发送者与接收者的解耦,适用于审批、消息路由等多处理者场景。

在C++中实现职责链模式,核心是将请求的发送者与接收者解耦,让多个对象都有机会处理请求,从而避免请求发送者与具体接收者之间的紧耦合。这种模式特别适用于有多个处理者可能处理同一请求,但具体由谁处理需在运行时决定的场景。
职责链模式的基本结构
职责链模式包含以下几个关键角色:
-
Handler(处理者):定义处理请求的接口,并持有下一个处理者的引用。
-
ConcreteHandler(具体处理者):实现处理逻辑,判断是否能处理当前请求,若不能则转发给下一节点。
-
Client(客户端):创建处理链并发送请求。
通过这种方式,请求沿着链传递,直到被某个处理者处理或到达链尾。
使用抽象基类和指针构建链式结构
在C++中,通常使用抽象基类来定义处理接口,再通过智能指针或原始指针连接各个处理者。
立即学习“C++免费学习笔记(深入)”;
LobeHub
LobeChat brings you the best user experience of ChatGPT, OLLaMA, Gemini, Claude
下载
// Handler.h
#include
#include iostream>
class Handler {
public:
virtual ~Handler() = default;
void setNext(std::shared_ptr next);
void handleRequest(int request);
protected:
std::shared_ptr nextHandler;
virtual bool canHandle(int request) = 0;
virtual void process(int request) = 0;
};
void Handler::setNext(std::shared_ptr next) {
nextHandler = next;
}
void Handler::handleRequest(int request) {
if (canHandle(request)) {
process(request);
} else if (nextHandler) {
nextHandler->handleRequest(request);
} else {
std::cout
// ConcreteHandlers.h
class Level1Handler : public Handler {
protected:
bool canHandle(int request) override { return request
构建和使用处理链
客户端代码负责组装处理链,并发起请求。
#include "ConcreteHandlers.h"
int main() {
auto h1 = std::make_shared();
auto h2 = std::make_shared();
auto h3 = std::make_shared();
h1->setNext(h2);
h2->setNext(h3);
// 发送不同请求
h1->handleRequest(5); // Level1 处理
h1->handleRequest(20); // Level2 处理
h1->handleRequest(80); // Level3 处理
h1->handleRequest(150); // 无处理者处理
return 0;
}
在这个例子中,请求从h1开始传递,每个处理者判断自己是否能处理,否则交给下一个。这样就实现了发送者(main函数中的调用)与最终接收者之间的解耦。
实际应用中的优化点
- 使用
std::shared_ptr管理生命周期,避免内存泄漏。
- 可加入优先级机制,动态调整链顺序。
- 支持链的拆分与合并,适应复杂业务流程。
- 添加日志记录,便于调试追踪请求路径。
基本上就这些。职责链模式在审批流程、异常处理、消息路由等场景非常实用,关键是设计好处理者的判断条件和链的组织方式。不复杂但容易忽略的是边界情况处理和资源管理。