一、責任鏈模式的概念
責任鏈模式也叫職責鏈模式,屬於行爲模式,該模式構造一系列分別擔當不同職責的類對象,來共同完成一個任務, 這些類對象之間像鏈條一樣緊密相連,所以被稱作職責鏈模式。
二、責任鏈模式使用場景
1、有多個對象可以處理同一個請求,具體哪個對象處理該請求由運行時刻自動確定。
2、當需要向多個對象中的一個提交一個請求時,可以使用職責鏈模式。
3、可以動態指定一組對象處理請求時,可以使用職責鏈模式。
三、責任鏈模式構建方法
1、處理抽象類
處理抽象父類給處理具體類提供統一的共同接口和方法。
2、處理具體類
處理具體類繼承處理抽象父類,用於實現處理抽象父類中的共同接口和方法。
四、責任鏈模式的示例
// ResponsibilityPattern.cpp : 此文件包含 "main" 函數。程序執行將在此處開始並結束。
//
#include <iostream>
#include <string>
using namespace std;
#define DELETE_PTR(p) {if(p!=nullptr){delete (p); (p)=nullptr;}}
// 員工請求類
class EmployeeRequest
{
public:
void setRequestContent(string contentStr)
{
if (contentStr.empty())
{
return;
}
m_contentStr = contentStr;
}
string getRequestContent()
{
return m_contentStr;
}
void setRequestCount(int count)
{
if (count <= 0)
{
return;
}
m_count = count;
}
int getRequestCount()
{
return m_count;
}
private:
string m_contentStr;
int m_count;
};
// 處理基類-管理者抽象類
class Manager
{
public:
Manager *setNextManager(Manager *pManager)
{
if (pManager == nullptr)
{
return nullptr;
}
m_pManager = pManager;
return pManager;
}
virtual void handleWork(EmployeeRequest *pEmployeeRequest) = 0;
protected:
Manager *m_pManager;
};
// 處理具體類-管理者具體實現類
// 部門經理
class DepartManager : public Manager
{
public:
virtual void handleWork(EmployeeRequest *pEmployeeRequest)
{
if ((pEmployeeRequest->getRequestContent()== "加薪") && pEmployeeRequest->getRequestCount() <=1000)
{
cout << "部門經理批准加薪:" << pEmployeeRequest->getRequestCount() << endl;
}
else
{
cout << "申請的數量太大,部門經理無權批准,傳遞給總監批准!" << endl;
if (m_pManager != nullptr)
{
m_pManager->handleWork(pEmployeeRequest);
}
}
}
};
// 總監
class MonitorManager : public Manager
{
public:
virtual void handleWork(EmployeeRequest *pEmployeeRequest)
{
if ((pEmployeeRequest->getRequestContent() == "加薪") && pEmployeeRequest->getRequestCount() <= 5000)
{
cout << "總監批准加薪:" << pEmployeeRequest->getRequestCount() << endl;
}
else
{
cout << "申請的數量太大,總監無權批准,傳遞給總經理批准!" << endl;
if (m_pManager != nullptr)
{
m_pManager->handleWork(pEmployeeRequest);
}
}
}
};
// 總經理
class GeneralManager : public Manager
{
public:
virtual void handleWork(EmployeeRequest *pEmployeeRequest)
{
if ((pEmployeeRequest->getRequestContent() == "加薪") && pEmployeeRequest->getRequestCount() <= 10000)
{
cout << "總經理批准加薪:" << pEmployeeRequest->getRequestCount() << endl;
}
else
{
cout << "申請的數量太大,總經理無權批准,傳遞給董事長批准!" << endl;
if (m_pManager != nullptr)
{
m_pManager->handleWork(pEmployeeRequest);
}
}
}
};
int main()
{
cout << "------------------職責鏈模式-------------------" << endl;
EmployeeRequest *pEmployeeRequest = new EmployeeRequest;
pEmployeeRequest->setRequestContent("加薪");
pEmployeeRequest->setRequestCount(3000);
GeneralManager *pGeneralManager = new GeneralManager;
MonitorManager *pMonitorManager = new MonitorManager;
DepartManager *pDepartManager = new DepartManager;
pDepartManager->setNextManager(pMonitorManager);
pMonitorManager->setNextManager(pGeneralManager);
pDepartManager->handleWork(pEmployeeRequest);
std::cout << "Hello World!\n";
getchar();
}
運行結果:
五、責任鏈模式的優缺點
優點:
1、責任的分擔明確, 每個類只需要處理自己該處理的工作 ,明確各個類的責任範圍。
2、降低耦合度,將請求的發送者和接收者進行解耦,類與類之間以松耦合的形式組織起來。
3、靈活性強,可以根據業務流程的變化進行自由組合對象鏈。
缺點:
1、處理時以鏈的形式在多個對象間傳遞消息,系統的性能有可能會受到影響,處理的速
度會變慢。
能力有限,如有錯誤,多多指教。。。