歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

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  
Copyright © Linux教程網 All Rights Reserved