概述:
辛辛苦苦了作業了一年,終于可以加薪了,向主管提交了加薪申請,主管一看不得了,自己職權不夠,批不了,主管把申請上交總監,總監發現自己也批不了,申請到了總經理手中,總經理一看,小伙子口氣不小了,有膽識敢申請,先來談下心。預知后事如何,請看下回分解。
這就是典型的職責鏈模式,請求的處理形成了一條鏈,直到有一個物件處理請求。責任鏈模式是一種物件的行為模式。在責任鏈模式里,很多物件由每一個物件對其下家的參考而連接起來形成一條鏈。請求在這個鏈上傳遞,直到鏈上的某一個物件決定處理此請求。發出這個請求的客戶端并不知道鏈上的哪一個物件最終處理這個請求,這使得系統可以在不影響客戶端的情況下動態地重新組織鏈和分配責任。
類圖與實體:
抽象處理者(Handler)角色:定義出一個處理請求的介面。如果需要,介面可以定義出一個方法,以設定和回傳對下家的參考。這個角色通常由一個抽象類或介面實作。
具體處理者(ConcreteHandler)角色:具體處理者接到請求后,可以選擇將請求處理掉,或者將請求傳給下家。由于具體處理者持有對下家的參考,因此,如果需要,具體處理者可以訪問下家。
樣例:
C/C++ code
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
#include <iostream>
#include <string>
using namespace std;
// 請求
class Request
{
public:
int m_nNumber;
};
// 管理者
class Manager
{
public:
Manager(string temp) { name = temp; }
void SetSuccessor(Manager* temp) { manager = temp; }
virtual void GetRequest(Request* request) = 0;
protected:
Manager* manager;
string name;
};
// 經理
class CommonManager : public Manager
{
public:
CommonManager(string strTemp) : Manager(strTemp) {}
virtual void GetRequest(Request* request);
};
void CommonManager::GetRequest(Request* request)
{
if (request->m_nNumber>=0 && request->m_nNumber<1000)
{
cout << name << " 處理了請求: " << request->m_nNumber << endl;
}
else
{
manager->GetRequest(request);
}
}
// 總監
class Majordomo : public Manager
{
public:
Majordomo(string strTemp) : Manager(strTemp) {}
virtual void GetRequest(Request* request);
};
void Majordomo::GetRequest(Request* request)
{
if (request->m_nNumber <= 5000)
{
cout << name << " 處理了請求: " << request->m_nNumber << endl;
}else
{
manager->GetRequest(request);
}
}
//總經理
class GeneralManager: public Manager
{
public:
GeneralManager(string name):Manager(name) {}
virtual void GetRequest(Request* request) //總經理可以處理所有請求
{
cout << name << " 處理了請求: " << request->m_nNumber << endl;
}
};
int main(){
Manager* common = new CommonManager("張經理");
Manager* major = new Majordomo("李總監");
GeneralManager* general = new GeneralManager("趙總");
common->SetSuccessor(major);
major->SetSuccessor(general);
Request* rq = new Request();
rq->m_nNumber = 999;
common->GetRequest(rq);
rq->m_nNumber = 4999;
common->GetRequest(rq);
rq->m_nNumber = 6999;
common->GetRequest(rq);
delete rq;
delete major;
delete common;
delete general;
return 0;
}
要點與實作:
1.要注意的是:一個請求到鏈的最后可能也沒有處理,所以一定要配置得當.
2.責任鏈模式并不創建責任鏈。責任鏈的創建必須由系統的其它部分創建出來。
3.責任鏈模式降低了請求的發送端和接收端之間的耦合,使多個物件都有機會處理這個請求。一個鏈可以是一條線,一個樹,也可以是一個環。如下圖所示,責任鏈是一個樹結構的一部分。
看到這里的各位加薪申請都是general批... :-))
我的博客里有其他已分享的理解:
我所理解的設計模式(C++實作)——責任鏈模式(Chain Of Responsibility Pattern)
我所理解的設計模式(C++實作)——代理模式(Proxy Pattern)
我所理解的設計模式(C++實作)——享元模式(Flyweight Pattern)
我所理解的設計模式(C++實作)——外觀模式(Facade Pattern)
我所理解的設計模式(C++實作)——裝飾者模式(Decorator Pattern)
我所理解的設計模式(C++實作)——組合模式(Composite Pattern)
我所理解的設計模式(C++實作)——配接器模式(Adapter Pattern)
我所理解的設計模式(C++實作)——原型模式(Prototype Pattern)
我所理解的設計模式(C++實作)——建造者模式(Builder Pattern)
我所理解的設計模式(C++實作)——抽象工廠模式(Abstract Factory Pattern)
我所理解的設計模式(C++實作)——工廠方法模式(Factory Method Pattern)
我所理解的設計模式(C++實作)——簡單工廠模式(Simple Factory Pattern)
我所理解的設計模式(C++實作)——橋模式(Bridge Pattern)
我所理解的設計模式(C++實作)——單例模式(Singleton Pattern)
uj5u.com熱心網友回復:
這個看起來和windows的訊息傳遞機制很想像
發出一個訊息(eg 用戶按鍵),送人訊息佇列,訊息回圈提取訊息,發給指定視窗,指定視窗進行處理,或者轉換為別的訊息,送給別的地方,如果訊息不需要處理,送到預設函式處理。
uj5u.com熱心網友回復:
話說,LZ發錯板塊了
uj5u.com熱心網友回復:
樓主很特別,我想把他這帖移動到C/C++版和VC版時,系統都說移動失敗,說他在該版被限制發帖,是不是平時灌水太多啊轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/155962.html
標籤:API
下一篇:SQL查詢并回傳
