行爲模式-責任鏈模式

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 總結

通過使用責任鏈模式,我們實現了一個動態的請求處理流程,可以簡單地添加或移除處理者,而不需要修改客戶端代碼。這樣,可以更靈活地管理和處理請求,並提高系統的可擴展性。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章