行为模式-责任链模式

发布时间 2023-11-10 10:32:33作者: Qt小罗

1 什么是责任链模式

责任链模式(Chain of Responsibility Pattern)是一种行为设计模式,用于建立一个对象链,每个对象都有机会处理请求。请求沿着对象链传递,直到有一个对象能够处理它为止。这样,责任链模式将请求的发送者和接收者解耦,动态确定处理请求的对象。
在责任链模式中,通常有两种角色:抽象处理者(Handler)和具体处理者(Concrete Handler)。抽象处理者定义了处理请求的接口,并实现了一个指向下一个处理者的引用。具体处理者继承自抽象处理者,负责实际的处理请求逻辑,并根据需要决定是否将请求传递给下一个处理者。

2 举个例子

下面以一个审批流程为例来说明责任链模式。假设有一个请假申请的处理流程,包括三个级别的审批者:组长、经理和总经理。每个审批者可以决定是否批准申请,并将申请传递给下一个级别的审批者,直到达到最终的处理者。
首先,我们定义一个抽象处理者接口Handler,其中包含两个方法:处理请求的HandleRequest和设置下一个处理者的SetNext。

class Handler
{
public:
    virtual void HandleRequest(const Request& request) = 0;
    virtual void SetNext(Handler* next) = 0;
};

然后,我们创建具体处理者类GroupLeader、Manager和GeneralManager,分别代表组长、经理和总经理。

class GroupLeader : public Handler
{
public:
    void HandleRequest(const Request& request)
    {
        if (request.level <= 1)
        {
            std::cout << "GroupLeader handle the request." << std::endl;
        }
        else if (next_ != nullptr)
        {
            next_->HandleRequest(request);
        }
    }

    void SetNext(Handler* next)
    {
        next_ = next;
    }

private:
    Handler* next_;
};

class Manager : public Handler
{
public:
    void HandleRequest(const Request& request)
    {
        if (request.level <= 2)
        {
            std::cout << "Manager handle the request." << std::endl;
        }
        else if (next_ != nullptr)
        {
            next_->HandleRequest(request);
        }
    }

    void SetNext(Handler* next)
    {
        next_ = next;
    }

private:
    Handler* next_;
};

class GeneralManager : public Handler
{
public:
    void HandleRequest(const Request& request)
    {
        if (request.level <= 3)
        {
            std::cout << "GeneralManager handle the request." << std::endl;
        }
        else
        {
            std::cout << "No one can handle the request." << std::endl;
        }
    }

    void SetNext(Handler* next)
    {
        next_ = next;
    }

private:
    Handler* next_;
};

最后,我们可以创建一个处理者链,并将请求从第一个处理者传递到链上的每个处理者,直到找到一个能够处理请求的处理者。

int main()
{
    Handler* groupLeader = new GroupLeader();
    Handler* manager = new Manager();
    Handler* generalManager = new GeneralManager();

    groupLeader->SetNext(manager);
    manager->SetNext(generalManager);

    Request request;
    request.level = 2;

    groupLeader->HandleRequest(request);

    delete groupLeader;
    delete manager;
    delete generalManager;

    return 0;
}

在上述例子中,当传入的请求级别为2时,组长(GroupLeader)对象将能够处理请求,并输出相应的处理消息。如果请求级别为3,则会继续将请求传递给下一个处理者,经理(Manager)对象进行处理。如果请求级别为4,则总经理(GeneralManager)对象将会处理请求。

3 总结

通过使用责任链模式,我们实现了一个动态的请求处理流程,可以简单地添加或移除处理者,而不需要修改客户端代码。这样,可以更灵活地管理和处理请求,并提高系统的可扩展性。