定义
职责链模式(Chain of Responsibility Pattern)是一种行为型设计模式,用于避免请求发送者与处理者之间的耦合。它通过将请求沿着一系列的处理对象链传递,直到链中的某个对象处理了请求。
结构
-
Handler(处理者) : 定义一个处理请求的接口,并实现具体的处理逻辑或将请求传递给下一个处理者。
-
ConcreteHandler(具体处理者) : 实现Handler接口,处理请求并在无法处理时将请求传递给下一个处理者。
-
Client(客户端) : 发送请求给链中的第一个处理者。
优点
-
解耦请求发送者和处理者: 请求的发送者只需要知道链的第一个处理者,而不需要知道具体的处理者。
-
灵活性: 可以动态地增加或修改处理者,不需要修改请求发送的代码。
-
责任分担: 每个处理者只关注自己能处理的请求,其他的则转发给下一个处理者。
代码示例
#include <iostream>
// Handler基类
class Handler
{
protected:
Handler* nextHandler; // 指向下一个处理者的指针
public:
Handler() : nextHandler(nullptr) {}
void setNextHandler(Handler* handler)
{
nextHandler = handler;
}
virtual void handleRequest(int request) = 0; // 纯虚函数
};
// 具体处理者A
class ConcreteHandlerA : public Handler
{
public:
void handleRequest(int request) override
{
if (request < 10)
{
std::cout << "Handler A processing request " << request << std::endl;
}
else if (nextHandler)
{
nextHandler->handleRequest(request);
}
}
};
// 具体处理者B
class ConcreteHandlerB : public Handler
{
public:
void handleRequest(int request) override
{
if (request >= 10 && request < 20)
{
std::cout << "Handler B processing request " << request << std::endl;
}
else if (nextHandler)
nextHandler->handleRequest(request);
}
}
};
int main()
{
// 创建处理者
Handler* handlerA = new ConcreteHandlerA();
Handler* handlerB = new ConcreteHandlerB();
// 设置职责链
handlerA->setNextHandler(handlerB);
// 发送请求
handlerA->handleRequest(5); // Output: Handler A processing request 5
handlerA->handleRequest(15); // Output: Handler B processing request 15
handlerA->handleRequest(25); // 无处理,链末尾没有处理者
// 清理
delete handlerA;
delete handlerB;
return 0;
}