13、跟学23种设计模式(C++版):责任链模式

责任链模式(Chain of Responsibility Pattern)是一种行为设计模式,它允许多个对象都有机会处理请求,从而避免请求的发送者与接收者之间的耦合。将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止。

模式特点

1、 解耦发送者和接收者:发送者只需要知道链的入口,而不需要知道链上的各个处理者;
2、 增强灵活性:可以动态地添加或删除责任链上的处理者,改变链的结构;
3、 责任分担:每个处理者只处理自己负责的请求,其余的请求传递给下一个处理者;

适用场景

1、 多个对象可以处理同一请求:但具体处理者在运行时决定,客户端不需要指定具体的处理者;
2、 动态指定处理链:处理者可以在运行时动态地组合;
3、 需要灵活的职责分配:避免对象之间的紧耦合关系;

C++案例

我们将实现一个简单的责任链模式,用于处理用户请求。假设有三种处理者:ManagerDirectorCEO,他们分别处理不同级别的请求。

#include <iostream>
#include <string>

class Handler {
public:
    virtual ~Handler() {}

    void setNextHandler(Handler* next) {
        this->nextHandler = next;
    }

    void handleRequest(const std::string& request) {
        if (this->canHandleRequest(request)) {
            this->processRequest(request);
        } else if (this->nextHandler) {
            this->nextHandler->handleRequest(request);
        } else {
            std::cout << "No handler available for the request: " << request << std::endl;
        }
    }

protected:
    virtual bool canHandleRequest(const std::string& request) = 0;
    virtual void processRequest(const std::string& request) = 0;

private:
    Handler* nextHandler = nullptr;
};

class Manager : public Handler {
protected:
    bool canHandleRequest(const std::string& request) override {
        return request == "low";
    }

    void processRequest(const std::string& request) override {
        std::cout << "Manager is handling the request: " << request << std::endl;
    }
};

class Director : public Handler {
protected:
    bool canHandleRequest(const std::string& request) override {
        return request == "medium";
    }

    void processRequest(const std::string& request) override {
        std::cout << "Director is handling the request: " << request << std::endl;
    }
};

class CEO : public Handler {
protected:
    bool canHandleRequest(const std::string& request) override {
        return request == "high";
    }

    void processRequest(const std::string& request) override {
        std::cout << "CEO is handling the request: " << request << std::endl;
    }
};

int main() {
    Handler* manager = new Manager();
    Handler* director = new Director();
    Handler* ceo = new CEO();

    manager->setNextHandler(director);
    director->setNextHandler(ceo);

    manager->handleRequest("low");
    manager->handleRequest("medium");
    manager->handleRequest("high");
    manager->handleRequest("undefined");

    delete manager;
    delete director;
    delete ceo;

    return 0;
}
  • 简要介绍

在这个案例中,我们定义了一个抽象类 Handler,它包含处理请求的方法和设置下一个处理者的方法。然后我们创建了三个具体处理者类 ManagerDirectorCEO,每个类都实现了抽象方法以处理特定级别的请求。最后,在 main 函数中,我们创建了责任链并处理了不同的请求。

*

总结

责任链模式是一种有效的设计模式,能够将请求的发送者与接收者解耦,增强系统的灵活性和可扩展性。通过责任链,系统可以动态地调整请求的处理方式,并且每个处理者只关注自己的职责,符合单一职责原则。该模式适用于多个对象可以处理同一请求且具体处理者在运行时决定的场景。

END

今天是日更的第24/100天

版权声明:本文不是「本站」原创文章,版权归原作者所有 | 原文地址: