promise實現一個簡單的併發控制
阿新 • • 發佈:2022-05-31
1. 觀察者模式
當一個物件的狀態發生變化時,通知者能夠自動通知所有的觀察者物件,自動重新整理物件狀態。 其實就是:當 Subject(被觀察者) 的狀態發生變化時,Observer(觀察者) 物件將通過一個 callback 函式 得到通知。 典型應用 - 偵聽事件驅動程式設計中的外部事件 - 偵聽/監視某個物件的狀態變化 - 釋出者/訂閱者(publisher/subscriber)模型中,當一個外部事件(新的產品,訊息的出現等等)被觸發時,通知郵件列表中的訂閱者 適用於:2. 案例
祕書:通知者(被觀察者) 員工:觀察者 讓多個觀察物件(公司員工)同時監聽一個主題物件(祕書),主題物件狀態發生變化時,會通知所有的觀察者,使它們能夠更新自己。 1 #include <iostream>
2 using namespace std;
3
4 #include "vector"
5 #include "string"
6
7 class Secretary;
8
9 //玩遊戲的同事類(觀察者)
10 class PlayserObserver
11 {
12 public:
13 PlayserObserver(string name, Secretary *secretary)
14 {
15 m_name = name;
16 m_secretary = secretary;
17 }
18 void update(string action) //觀察者通過此回撥函式來得到通知
19 {
20 cout << "觀察者收到 action:" << action << endl;
21 }
22 private:
23 string m_name;
24 Secretary *m_secretary; //每一個觀察者內部都有一個被觀察者(通知者)
25 };
26
27 //祕書類(主題物件,通知者,被觀察者)
28 //被觀察者當需要被觀察的狀態發生變化時,需要通知佇列中所有觀察者物件。需要維持(新增,刪除,通知)一個觀察者物件的佇列列表。
29 class Secretary
30 {
31 public:
32 void addObserver(PlayserObserver *o)
33 {
34 v.push_back(o);
35 }
36 void Notify(string action) //用來通知所有的觀察者
37 {
38 for (vector<PlayserObserver *>::iterator it= v.begin(); it!=v.end(); it++ )
39 {
40 (*it)->update(action); //呼叫觀察者的回撥函式
41 }
42 }
43 void setAction(string action)
44 {
45 m_action = action;
46 Notify(m_action);
47 }
48 private:
49 string m_action;
50 vector<PlayserObserver *> v; //通知者(被觀察者)維持一個觀察者物件的佇列列表
51 };
52
53 int main()
54 {
55 //subject 被觀察者(祕書)
56 Secretary *s1 = new Secretary;
57
58 //具體的觀察者 被通知物件
59 PlayserObserver *po1 = new PlayserObserver("小張", s1);
60 PlayserObserver *po2 = new PlayserObserver("小李", s1);
61
62 s1->addObserver(po1); //新增一個觀察者到通知者的佇列中
63 s1->addObserver(po2); //新增一個觀察者到通知者的佇列中
64
65 s1->setAction("老闆來了");
66 s1->setAction("老闆走了");
67
68 return 0;
69 }
執行結果: