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