觀察者模式之比喻:ios
1 /** 2 * Define observer mode 3 */ 4 #include <iostream> 5 #include <list> 6 using namespace std; 7 8 #ifndef NULL 9 #define NULL ((void*)0) 10 #endif 11 12 // 各類消息的基類 13 class DOBject 14 { 15 public: 16 DOBject(int value){ 17 value = value; 18 } 19 ~DOBject(); 20 private: 21 public: 22 /* data */ 23 int value; 24 public: 25 /* Function */ 26 bool operator ==(const DOBject &otherObject){ 27 return (value==otherObject.value); 28 } 29 }; 30 // 類員工類 31 class DListener 32 { 33 public: 34 DListener(/*arguments*/); 35 ~DListener(); 36 /* data */ 37 /* Respond to notify */ 38 public: 39 void OnNotify(DObject *object) 40 { 41 // Do something 42 return ; 43 } 44 }; 45 // 類前臺類 46 class DObserverObject 47 { 48 public: 49 DObserverObject(/*arguments*/){ 50 m_pListeners = new List<DListener*>(); 51 m_pObject = new DObject(); 52 } 53 ~DObserverObject(){ 54 if (NULL != m_pObject) 55 { 56 /* code */ 57 delete m_pObject; 58 } 59 if (NULL != m_pListeners) 60 { 61 /* 須要循環把list裏面的註冊者都清理掉 */ 62 for(int i=0, count=m_pListeners->size(); i < count; ++i){ 63 delete m_pListeners->get(i); 64 m_pListeners->get(i) = NULL; 65 } 66 delete m_pListeners; 67 } 68 } 69 // 員工註冊 70 void Registe(DListener *newListener){ 71 m_pListeners->add(newListener); 72 } 73 // 取消註冊 74 void UnRegiste(DListener *newListener){ 75 m_pListeners->remove(newListener); 76 } 77 //通知員工 78 void SendNotify(void){ 79 for (int i = 0; i < m_pListeners.size(); ++i) 80 { 81 /* 須要循環將全部註冊的員工都通知到 */ 82 m_pListeners[i]->OnNotify(m_pObject); 83 } 84 } 85 // 通常對於這個有倆種傳遞數據的方式,推或者拉 86 // 對於推方式,則SendNotify須要加參數; 87 // 對於拉方式,則SendNotify不須要參數,由員工本身經過GetValue去取 88 DObject *GetValue(void){ 89 return m_pObject; 90 } 91 //發生了什麼事情,老闆來了,或者快遞來了 92 void SetValue(DObject *newObject){ 93 if (m_pObject!=*newObject) 94 { 95 /* code */ 96 m_pObject->value = newObject->value; 97 SendNotify(newObject); 98 } 99 } 100 /* data */ 101 private: 102 List<DListener*> *m_pListeners; 103 DObject *m_pObject; 104 };
對於以上代碼可能對於list的使用存在問題,還未徹底測試,有興趣的能夠本身進行測試,也能夠本身本身採用其餘數據結構!web
謝謝!數據結構