设计模式---职责链模式

70 阅读2分钟

定义

职责链模式(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;
}