歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Observer模式Linux下的C++實現

Observer模式Linux下的C++實現

日期:2017/3/1 10:26:22   编辑:Linux編程

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. #define SAFE_DELETE(p) { if(p) { delete (p); (p)=NULL; } }
  8. #define SAFE_DELETE_ARRAY(p) { if(p) { delete[] (p); (p)=NULL; } }
  9. class Mutex
  10. {
  11. public:
  12. Mutex()
  13. {
  14. pthread_mutex_init(&m_lock,NULL);
  15. }
  16. ~Mutex()
  17. {
  18. pthread_mutex_destroy(&m_lock);
  19. }
  20. void Lock()
  21. {
  22. pthread_mutex_lock(&m_lock);
  23. }
  24. void UnLock()
  25. {
  26. pthread_mutex_unlock(&m_lock);
  27. }
  28. private:
  29. pthread_mutex_t m_lock;
  30. };
  31. class IObserver;
  32. class ISubject
  33. {
  34. public:
  35. ISubject() : m_statusSubject(-1) {}
  36. virtual ~ISubject();
  37. void Register(IObserver *pObserver);
  38. void UnRegister(IObserver *pObserver);
  39. virtual void SetStatus(STATUS status) = 0;
  40. virtual STATUS GetStatus() = 0;
  41. virtual void Notify() = 0;
  42. protected:
  43. STATUS m_statusSubject;
  44. Mutex m_mutex;
  45. list<IObserver*> m_listObserver;
  46. };
  47. class Subject : public ISubject
  48. {
  49. public:
  50. Subject() {}
  51. virtual ~Subject() {};
  52. virtual void SetStatus(STATUS status);
  53. virtual STATUS GetStatus();
  54. virtual void Notify();
  55. };
  56. class IObserver
  57. {
  58. public:
  59. IObserver() : m_statusObserver(-1) {}
  60. virtual ~IObserver() {}
  61. virtual void Update(ISubject* pSubject) = 0;
  62. protected:
  63. STATUS m_statusObserver;
  64. };
  65. class Observer : public IObserver
  66. {
  67. public:
  68. Observer() {}
  69. virtual ~Observer() {}
  70. virtual void Update(ISubject* pSubject);
  71. };
  72. #endif
Copyright © Linux教程網 All Rights Reserved