责任链模式(Chain of Responsibility)
责任链模式是一种行为型设计模式,旨在避免请求发送者和接收者之间的紧耦合关系。它通过将请求沿着一系列处理对象传递的方式,使得多个对象有机会处理请求。责任链模式的核心思想是将请求的处理分散到多个对象上,每个对象只处理自己能力范围内的请求,并将处理未完成的请求传递给链中的下一个对象。
1. 责任链模式的结构
责任链模式包含以下几个主要组件:
- Handler(处理者接口): 定义了处理请求的接口,并声明了设置下一个处理者的方法。
- ConcreteHandler(具体处理者): 实现了
Handler
接口,负责处理请求或者将请求传递给下一个处理者。 - Client(客户端): 向链中的第一个处理者发送请求。
2. Mermaid 关系图
以下是责任链模式的类图,用 Mermaid 表示:
classDiagram class Handler { + setNext(handler : Handler) : void + handleRequest(request : int) : void } class ConcreteHandlerA { + handleRequest(request : int) : void } class ConcreteHandlerB { + handleRequest(request : int) : void } class Client { + makeRequest(handler : Handler) : void } Handler <|-- ConcreteHandlerA Handler <|-- ConcreteHandlerB Client --> Handler : "请求" Handler --> Handler : "链"
3. 责任链模式的实现
Handler 处理者接口:
class Handler {
protected:
Handler* nextHandler;
public:
Handler() : nextHandler(nullptr) {}
virtual ~Handler() = default;
void setNext(Handler* handler) {
nextHandler = handler;
}
virtual void handleRequest(int request) const = 0;
};
ConcreteHandlerA 具体处理者A:
class ConcreteHandlerA : public Handler {
public:
void handleRequest(int request) const override {
if (request >= 0 && request < 10) {
std::cout << "ConcreteHandlerA handles request " << request << "\n";
} else if (nextHandler) {
nextHandler->handleRequest(request);
}
}
};
ConcreteHandlerB 具体处理者B:
class ConcreteHandlerB : public Handler {
public:
void handleRequest(int request) const override {
if (request >= 10 && request < 20) {
std::cout << "ConcreteHandlerB handles request " << request << "\n";
} else if (nextHandler) {
nextHandler->handleRequest(request);
}
}
};
Client 客户端代码:
int main() {
Handler* handlerA = new ConcreteHandlerA();
Handler* handlerB = new ConcreteHandlerB();
handlerA->setNext(handlerB);
handlerA->handleRequest(5); // Handled by ConcreteHandlerA
handlerA->handleRequest(15); // Handled by ConcreteHandlerB
handlerA->handleRequest(25); // No handler in the chain
delete handlerB;
delete handlerA;
return 0;
}
4. 使用责任链模式
在客户端代码中,构造一个处理链,并设置每个处理者的下一个处理者。客户端将请求发送到链的起始点,链中的每个处理者依次处理请求,直到请求被处理或到达链的末端。
5. 总结
责任链模式通过将请求沿着处理链传递,使得多个对象有机会处理请求,从而减少了请求发送者和接收者之间的紧耦合关系。Mermaid 类图展示了处理者接口、具体处理者类以及它们之间的关系,帮助理解模式的结构和实现。