1. 程式人生 > 其它 >promise實現一個簡單的併發控制

promise實現一個簡單的併發控制

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 }

執行結果: