观察者模式之比喻:
有家公司,老板经常不按时上班,于是员工就可以在老板来之前的那段时间娱乐一下,但是又过的是心惊胆战,怕
老板随时出现;这是观察者模式就起作用了;公司有个前台,她总是第一个看到老板进门并且有时间通知大家的人,
于是员工都可以在前台那里登记一下,是否需要得到通知,其他事情也可以通过前台通知,比如说来了一个快递等;
实现代码如下:
1 /** 2 * Define observer mode 3 */ 4 #include5 #include 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
(); 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 *m_pListeners;103 DObject *m_pObject;104 };
对于以上代码可能对于list的使用存在问题,还未完全测试,有兴趣的可以自己进行测试,也可以自己自己采用其他数据结构!
谢谢!