20责任链模式
1責任鏈模式的核心內容是:
A:定義請求類
B:定義Manager的父類,并且可以通過這個類來設置上下級關系。
C:定義各種角色的實現類
2責任鏈模式的作用:通過責任鏈模式模擬請假的過程。
3責任鏈模式具體描述
責任鏈模式:在責任鏈模式中,很多對象由每一個對象對其下家的引用而接起來形成
一條鏈。請求在這個鏈上傳遞,直到鏈上的某一個對象決定處理此請求。
客戶并不知道鏈上的哪一個對象最終處理這個請求,系統可以在不影響客戶端的
情況下動態的重新組織鏈和分配責任。處理者有兩個選擇:承擔責任或者把責任
推給下家。一個請求可以最終不被任何接收端對象所接受。
?
晚上去上英語課,為了好開溜坐到了最后一排,哇,前面坐了好幾個漂亮的MM哎,
找張紙條,寫上“Hi, 可以做我的女朋友嗎?如果不愿意請向前傳”,
紙條就一個接一個的傳上去了,糟糕,傳到第一排的MM把紙條傳給老師了,
聽說是個老處女呀,快跑!
4責任鏈模式類圖
5.代碼:
#include<iostream>
#include <string>
using namespace std;
?
//責任鏈模式:在責任鏈模式中,很多對象由每一個對象對其下家的引用而接起來形成
//一條鏈。請求在這個鏈上傳遞,直到鏈上的某一個對象決定處理此請求。
//客戶并不知道鏈上的哪一個對象最終處理這個請求,系統可以在不影響客戶端的
//情況下動態的重新組織鏈和分配責任。處理者有兩個選擇:承擔責任或者把責任
//推給下家。一個請求可以最終不被任何接收端對象所接受。
?
//晚上去上英語課,為了好開溜坐到了最后一排,哇,前面坐了好幾個漂亮的MM哎,
//找張紙條,寫上“Hi, 可以做我的女朋友嗎?如果不愿意請向前傳”,
//紙條就一個接一個的傳上去了,糟糕,傳到第一排的MM把紙條傳給老師了,
//聽說是個老處女呀,快跑!
class Request? //請求
{
public:
??? string requestType;
??? string requestContent;
??? int number;
};
?
class Manager? ///管理者
{
protected:
??? string name;
??? Manager *superior;
public:
??? Manager(string name)
??? {
??????? this->name = name;
??? }
??? //superior:上級的出眾的
??? void setSuperior(Manager *superior)
??? {
??????? this->superior = superior;
??? }
??? virtual void requestApplications(Request *request) = 0;
};
?
class CommonManager :public Manager? //經理
{
public:
??? CommonManager(string name) :Manager(name)
??? {}
??? void requestApplications(Request *request)
??? {
??????? if (request->requestType == "請假" && request->number <= 2)
??????? {
??????????? cout << name << " " << request->requestContent << " 數量:"<< request->number << "被批準" << endl;
??????? }
??????? else
??????? {
??????????? if (superior != NULL)
??????????? {
??????????????? superior->requestApplications(request);
??????????? }
??????? }
??? }
};
?
class Majordomo :public Manager? //總監
{
public:
??? Majordomo(string name) :Manager(name)
??? {}
??? void requestApplications(Request *request)
??? {
??????? if (request->requestType == "請假" && request->number <= 5)
??????? {
??????????? cout << name << " " << request->requestContent << " 數量:"<< request->number << "被批準" << endl;
??????? }
??????? else
??????? {
??????????? if (superior != NULL)
??????????? {
??????????????? superior->requestApplications(request);
??????????? }
??????? }
??? }
};
?
?
class GeneralManager :public Manager //總經理
{
public:
??? GeneralManager(string name) :Manager(name)
??? {}
??? void requestApplications(Request *request)
??? {
??????? if (request->requestType == "請假")
??????? {
??????????? cout << name << " " << request->requestContent << " 數量:"<< request->number << "被批準" << endl;
??????? }
??? }
};
?
int main()
{
??? //先實例化個人
??? CommonManager *jinli = new CommonManager("經理");
??? Majordomo *zongjian = new Majordomo("總監");
??? GeneralManager *zhongjingli = new GeneralManager("總經理");
?
??? //設置好三個實例之間的關系
??? jinli->setSuperior(zongjian);
??? //最后通過這種關系向下傳遞
??? zongjian->setSuperior(zhongjingli);
?
??? Request *request = new Request();
?
??? request->requestType = "請假";
??? request->requestContent = "李俊宏請假";
??? request->number = 1;
??? jinli->requestApplications(request);
?
??? cout << "--------------------------" << endl;
?
??? request->requestType = "請假";
??? request->requestContent = "李俊宏請假";
??? request->number = 4;
??? jinli->requestApplications(request);
?
??? cout << "--------------------------" << endl;
?
??? request->requestType = "請假";
??? request->requestContent = "李俊宏請假";
??? request->number = 10;
??? jinli->requestApplications(request);
???
??? cin.get();
??? return 0;
}
運行結果如下:
總結