1 #include <iostream> 2 #include <vector> 3 #include <functional> 4 #include <iomanip> 5 #include <set> 6 7 using namespace std; 8 9 class Observer{ 10 public: 11 void update(){ 12 cout<<"update"<<endl; 13 } 14 }; 15 class Subject{ 16 public: 17 void regist(Observer *pobs){ 18 pobs_set.insert(pobs); 19 } 20 void unregist(Observer *pobs){ 21 pobs_set.erase(pobs); 22 } 23 void change(const int state){ 24 this->state = state; 25 notify(); 26 } 27 private: 28 void notify(){ 29 for(auto po : this->pobs_set){ 30 po->update(); 31 } 32 } 33 multiset<Observer*> pobs_set; 34 int state; 35 }; 36 int main() 37 { 38 Observer o1,o2,o3; 39 Subject sub; 40 sub.regist(&o1); 41 sub.regist(&o2); 42 sub.regist(&o3); 43 44 sub.change(12); 45 46 cout<<"----------------"<<endl; 47 sub.unregist(&o1); 48 sub.change(122); 49 50 51 return 0; 52 }
以下內容 ref :http://c.biancheng.net/view/1390.html
意圖:定義物件間的一種一對多的依賴關系,當一個物件的狀態發生改變時,所有依賴于它的物件都得到通知并被自動更新,
主要解決:一個物件狀態改變給其他物件通知的問題,而且要考慮到易用和低耦合,保證高度的協作,
何時使用:一個物件(目標物件)的狀態發生改變,所有的依賴物件(觀察者物件)都將得到通知,進行廣播通知,
如何解決:使用面向物件技術,可以將這種依賴關系榷訓,
關鍵代碼:在抽象類里有一個 ArrayList 存放觀察者們,
應用實體: 1、拍賣的時候,拍賣師觀察最高標價,然后通知給其他競價者競價, 2、西游記里面悟空請求菩薩降服紅孩兒,菩薩灑了一地水招來一個老烏龜,這個烏龜就是觀察者,他觀察菩薩灑水這個動作,
優點: 1、觀察者和被觀察者是抽象耦合的, 2、建立一套觸發機制,
缺點: 1、如果一個被觀察者物件有很多的直接和間接的觀察者的話,將所有的觀察者都通知到會花費很多時間, 2、如果在觀察者和觀察目標之間有回圈依賴的話,觀察目標會觸發它們之間進行回圈呼叫,可能導致系統崩潰, 3、觀察者模式沒有相應的機制讓觀察者知道所觀察的目標物件是怎么發生變化的,而僅僅只是知道觀察目標發生了變化,
使用場景:
- 一個抽象模型有兩個方面,其中一個方面依賴于另一個方面,將這些方面封裝在獨立的物件中使它們可以各自獨立地改變和復用,
- 一個物件的改變將導致其他一個或多個物件也發生改變,而不知道具體有多少物件將發生改變,可以降低物件之間的耦合度,
- 一個物件必須通知其他物件,而并不知道這些物件是誰,
- 需要在系統中創建一個觸發鏈,A物件的行為將影響B物件,B物件的行為將影響C物件……,可以使用觀察者模式創建一種鏈式觸發機制,
注意事項: 1、JAVA 中已經有了對觀察者模式的支持類, 2、避免回圈參考, 3、如果順序執行,某一觀察者錯誤會導致系統卡殼,一般采用異步方式,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/374380.html
標籤:其他
上一篇:架構師三大難-領域劃分問題
