Observer模式Linux下的C++实现


Observer模式定义对象间的一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

Observer模式定义的是一种一对多的关系,一是Subject类,而多则是Obesrver类,当Subject类的状态发生变化的时候通知与之对应的Obesrver类们也去相应的更新状态,同时支持动态的添加和删除Observer对象的功能。

Subject类一般都是采用链表等容器来存放Observer对象指针;

Observer类一般是抽取Observer对象的一些公共的属性形成Observer基类,而Subject中保存的则是Observer类对象的指针,这样就使Subject和具体的Observer实现了解耦;

下面是测试代码:

  1. #ifndef OBSERVER_H   
  2. #define OBSERVER_H   
  3. #include <list>   
  4. #include <pthread.h>   
  5. using namespace std;  
  6. typedef int STATUS;  
  7.   
  8. #define SAFE_DELETE(p) { if(p) { delete (p); (p)=NULL; } }   
  9. #define SAFE_DELETE_ARRAY(p) { if(p) { delete[] (p); (p)=NULL; } }   
  10.   
  11. class Mutex    
  12. {    
  13. public:    
  14.     Mutex()    
  15.     {  
  16.         pthread_mutex_init(&m_lock,NULL);   
  17.     }    
  18.   
  19.     ~Mutex()    
  20.     {    
  21.         pthread_mutex_destroy(&m_lock);   
  22.     }    
  23.   
  24.     void Lock()    
  25.     {    
  26.         pthread_mutex_lock(&m_lock);  
  27.     }    
  28.   
  29.     void UnLock()    
  30.     {    
  31.         pthread_mutex_unlock(&m_lock);  
  32.     }   
  33.   
  34. private:    
  35.     pthread_mutex_t m_lock;    
  36. };  
  37.   
  38. class IObserver;  
  39. class ISubject  
  40. {  
  41. public:  
  42.     ISubject() : m_statusSubject(-1) {}  
  43.     virtual   ~ISubject();  
  44.     void      Register(IObserver *pObserver);  
  45.     void      UnRegister(IObserver *pObserver);   
  46.     virtual   void     SetStatus(STATUS status) = 0;  
  47.     virtual   STATUS   GetStatus() = 0;  
  48.     virtual   void     Notify() = 0;  
  49.   
  50. protected:  
  51.     STATUS             m_statusSubject;  
  52.     Mutex              m_mutex;  
  53.     list<IObserver*>   m_listObserver;  
  54. };  
  55.   
  56. class Subject : public ISubject  
  57. {  
  58. public:  
  59.     Subject() {}  
  60.     virtual ~Subject() {};  
  61.     virtual   void     SetStatus(STATUS status);  
  62.     virtual   STATUS   GetStatus();  
  63.     virtual   void     Notify();          
  64. };  
  65.   
  66. class IObserver  
  67. {  
  68. public:  
  69.     IObserver() : m_statusObserver(-1) {}  
  70.     virtual ~IObserver() {}  
  71.     virtual void Update(ISubject* pSubject) = 0;  
  72. protected:  
  73.     STATUS m_statusObserver;  
  74. };  
  75.   
  76. class Observer : public IObserver  
  77. {  
  78. public:  
  79.     Observer() {}  
  80.     virtual ~Observer() {}  
  81.     virtual void Update(ISubject* pSubject);  
  82. };  
  83. #endif  
  • 1
  • 2
  • 3
  • 下一页

相关内容