設計模式之責任鏈模式-做人要有點責任感!

一、責任鏈模式的概念

責任鏈模式也叫職責鏈模式,屬於行爲模式,該模式構造一系列分別擔當不同職責的類對象,來共同完成一個任務, 這些類對象之間像鏈條一樣緊密相連,所以被稱作職責鏈模式。

二、責任鏈模式使用場景

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、處理時以鏈的形式在多個對象間傳遞消息,系統的性能有可能會受到影響,處理的速
度會變慢。

能力有限,如有錯誤,多多指教。。。

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