c++ 观察者模式

观察者模式之比喻:

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

谢谢!

转载于:https://www.cnblogs.com/dhf-0214/p/3511158.html

猜你喜欢

转载自blog.csdn.net/weixin_33786077/article/details/93760870