职责链设计模式是一种行为设计模式,其目的是解耦发送者和接收者,使得多个对象都有机会处理请求,从而避免请求发送者和接收者之间的紧耦合关系。在这种设计模式中,请求沿着一个对象链传递,直到有一个对象处理请求为止。
在职责链设计模式中,通常会有一个抽象处理者和多个具体处理者组成一个处理者链,每个具体处理者都有一个指向下一个处理者的指针。当有请求到达时,第一个具体处理者会尝试处理请求,如果处理不了,就会将请求传递给下一个处理者,直到有处理者处理了请求为止。
理解职责链设计模式,可以将其比喻为一个问题的解决者链。当一个问题出现时,首先交给第一个解决者去解决,如果第一个解决者解决不了,就交给下一个解决者,直到有一个解决者解决了问题。
示例代码:
#include <iostream> // 抽象处理者 class Handler { public: virtual void handleRequest(int request) = 0; void setNextHandler(Handler *next) { nextHandler = next; } protected: Handler *nextHandler; }; // 具体处理者A class ConcreteHandlerA : public Handler { public: void handleRequest(int request) override { if (request < 10) { std::cout << "ConcreteHandlerA handles the request." << std::endl; } else if (nextHandler != nullptr) { nextHandler->handleRequest(request); } } }; // 具体处理者B class ConcreteHandlerB : public Handler { public: void handleRequest(int request) override { if (request >= 10 && request < 20) { std::cout << "ConcreteHandlerB handles the request." << std::endl; } else if (nextHandler != nullptr) { nextHandler->handleRequest(request); } } }; // 具体处理者C class ConcreteHandlerC : public Handler { public: void handleRequest(int request) override { if (request >= 20) { std::cout << "ConcreteHandlerC handles the request." << std::endl; } else { std::cout << "No one can handle the request." << std::endl; } } }; int main() { Handler *handlerA = new ConcreteHandlerA(); Handler *handlerB = new ConcreteHandlerB(); Handler *handlerC = new ConcreteHandlerC(); handlerA->setNextHandler(handlerB); handlerB->setNextHandler(handlerC); handlerA->handleRequest(8); // Output: ConcreteHandlerA handles the request. handlerA->handleRequest(15); // Output: ConcreteHandlerB handles the request. handlerA->handleRequest(25); // Output: ConcreteHandlerC handles the request. delete handlerA; delete handlerB; delete handlerC; return 0; }