設計模式—責任鏈模式(二十)

        軟件領域中的設計模式的重要性不言而喻。設計模式中運用了面向對象編程語言的重要特性:封裝、繼承、多態。雖然知道這些特性的定義但是並沒有做到真正的理解,這樣特性有什麼作用?用於什麼場合中等等問題,帶着疑問開始學習設計模式,主要參考《大話設計模式》和《設計模式:可複用面向對象軟件的基礎》兩本書。

        責任鏈模式(Chain of Responsibility):使多個對象都有機會處理請求,從而避免請求的發送者和接收者之間的耦合關係。將這個對象連成一條鏈,並沿着這條鏈傳遞該請求,直到有一個對象處理爲止。

        責任鏈很好理解就是基類和不同子類組成的“鏈”式結構;



#include <iostream>
#include <string>
#include <vector>
using namespace std;
//請求
class Request
{
public:
	string m_strContent;
	int m_nNumber;
	string requestType;
};
//管理者
class Manager
{
protected:
	Manager* manager;
	string name;	
public:
	Manager(string temp)
	{
		name = temp;
	}
	void SetSuccessor(Manager* temp)
	{
		manager = temp;
	}
	virtual void GetRequest(Request* request) = 0;
};
//經理
class CommonManager : public Manager
{
public:
	CommonManager(string strTemp) : Manager(strTemp){}
	virtual void GetRequest(Request* request)
	{
		if (request->requestType=="請假" && request->m_nNumber<10)
		{
			cout << name << "  請假" << request->m_nNumber << " 天" << endl;
		}
		else
		{
			manager->GetRequest(request);
		}
	}
};
//總監
class MajorDomo : public Manager
{
public:
	MajorDomo(string name) : Manager(name){}

	virtual void GetRequest(Request* request)
	{
		if (request->requestType == "請假" && request->m_nNumber >= 10)
		{
			cout << name << "  請假" << request->m_nNumber << " 天" << endl;
		}
	}
};

//客戶端
int main()
{
	Manager * common = new CommonManager("張經理");
	Manager * major = new MajorDomo("李總監");

	common->SetSuccessor(major);

	Request* req = new Request();
	req->requestType = "請假";
	req->m_nNumber = 33;
	common->GetRequest(req);

	req->m_nNumber = 3;
	common->GetRequest(req);
	return 0;
}


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