c++ 觀察者模式

觀察者模式之比喻: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

謝謝!數據結構

相關文章
相關標籤/搜索