observer_impl_base.h 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. #ifndef OBSERVER_IMPL_BASE_HPP
  2. #define OBSERVER_IMPL_BASE_HPP
  3. #include <map>
  4. #include <vector>
  5. template <typename ReturnT, typename ParamT>
  6. class ReceiverImplBase;
  7. template <typename ReturnT, typename ParamT>
  8. class ObserverImplBase
  9. {
  10. public:
  11. virtual void AddReceiver(ReceiverImplBase<ReturnT, ParamT>* receiver) = 0;
  12. virtual void RemoveReceiver(ReceiverImplBase<ReturnT, ParamT>* receiver) = 0;
  13. virtual ReturnT Broadcast(ParamT param) = 0;
  14. virtual ReturnT Notify(ParamT param) = 0;
  15. };
  16. template <typename ReturnT, typename ParamT>
  17. class ReceiverImplBase
  18. {
  19. public:
  20. virtual void AddObserver(ObserverImplBase<ReturnT, ParamT>* observer) = 0;
  21. virtual void RemoveObserver() = 0;
  22. virtual ReturnT Receive(ParamT param) = 0;
  23. virtual ReturnT Respond(ParamT param, ObserverImplBase<ReturnT, ParamT>* observer) = 0;
  24. };
  25. template <typename ReturnT, typename ParamT>
  26. class ReceiverImpl;
  27. template <typename ReturnT, typename ParamT>
  28. class ObserverImpl : public ObserverImplBase<ReturnT, ParamT>
  29. {
  30. public:
  31. ObserverImpl()
  32. : count_(0)
  33. {}
  34. virtual ~ObserverImpl() {}
  35. virtual void AddReceiver(ReceiverImplBase<ReturnT, ParamT>* receiver)
  36. {
  37. if (receiver == NULL)
  38. return;
  39. receivers_[count_] = receiver;
  40. receiver->AddObserver(this);
  41. count_++;
  42. }
  43. virtual void RemoveReceiver(ReceiverImplBase<ReturnT, ParamT>* receiver)
  44. {
  45. if (receiver == NULL)
  46. return;
  47. ReceiversMap::iterator it = receivers_.begin();
  48. for (; it != receivers_.end(); ++it)
  49. {
  50. if (it->second == receiver)
  51. {
  52. receivers_.erase(it);
  53. break;
  54. }
  55. }
  56. }
  57. virtual ReturnT Broadcast(ParamT param)
  58. {
  59. ReceiversMap::iterator it = receivers_.begin();
  60. for (; it != receivers_.end(); ++it)
  61. {
  62. it->second->Receive(param);
  63. }
  64. return ReturnT();
  65. }
  66. virtual ReturnT Notify(ParamT param)
  67. {
  68. ReceiversMap::iterator it = receivers_.begin();
  69. for (; it != receivers_.end(); ++it)
  70. {
  71. it->second->Respond(param, this);
  72. }
  73. return ReturnT();
  74. }
  75. protected:
  76. typedef std::map<int, ReceiverImplBase<ReturnT, ParamT>*> ReceiversMap;
  77. ReceiversMap receivers_;
  78. int count_;
  79. };
  80. template <typename ReturnT, typename ParamT>
  81. class ReceiverImpl : public ReceiverImplBase<ReturnT, ParamT>
  82. {
  83. public:
  84. ReceiverImpl()
  85. : count_(0)
  86. {}
  87. virtual ~ReceiverImpl() {}
  88. virtual void AddObserver(ObserverImplBase<ReturnT, ParamT>* observer)
  89. {
  90. observers_[count_] = observer;
  91. count_++;
  92. }
  93. virtual void RemoveObserver()
  94. {
  95. ObserversMap::iterator it = observers_.begin();
  96. for (; it != observers_.end(); ++it)
  97. {
  98. it->second->RemoveReceiver(this);
  99. }
  100. }
  101. virtual ReturnT Receive(ParamT param)
  102. {
  103. return ReturnT();
  104. }
  105. virtual ReturnT Respond(ParamT param, ObserverImplBase<ReturnT, ParamT>* observer)
  106. {
  107. return ReturnT();
  108. }
  109. protected:
  110. typedef std::map<int, ObserverImplBase<ReturnT, ParamT>*> ObserversMap;
  111. ObserversMap observers_;
  112. int count_;
  113. };
  114. #endif // OBSERVER_IMPL_BASE_HPP