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