职责链设计模式初探

发布时间 2023-12-12 16:43:14作者: Justin_Hu

职责链设计模式是一种行为设计模式,其目的是解耦发送者和接收者,使得多个对象都有机会处理请求,从而避免请求发送者和接收者之间的紧耦合关系。在这种设计模式中,请求沿着一个对象链传递,直到有一个对象处理请求为止。
    在职责链设计模式中,通常会有一个抽象处理者和多个具体处理者组成一个处理者链,每个具体处理者都有一个指向下一个处理者的指针。当有请求到达时,第一个具体处理者会尝试处理请求,如果处理不了,就会将请求传递给下一个处理者,直到有处理者处理了请求为止。
    理解职责链设计模式,可以将其比喻为一个问题的解决者链。当一个问题出现时,首先交给第一个解决者去解决,如果第一个解决者解决不了,就交给下一个解决者,直到有一个解决者解决了问题。

示例代码:

#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;
}