fork download
  1. #include <iostream>
  2. #include <list>
  3.  
  4. template<typename T>
  5. class Observer {
  6. public:
  7. //private:
  8. virtual void notify(const T& data) = 0;
  9. public:
  10. virtual ~Observer() = default;
  11. };
  12.  
  13. template<typename T>
  14. class Subject {
  15. public:
  16. void subscribe(Observer<T> *observer);
  17. void unsubscribe(Observer<T> *observer);
  18. virtual ~Subject() = default;
  19. protected:
  20. void notify(const T& data);
  21. private:
  22. std::list<Observer<T>*> observers;
  23. };
  24.  
  25. template<typename T>
  26. void Subject<T>::subscribe(Observer<T> *observer) {
  27. this->observers.push_back(observer);
  28. }
  29.  
  30. template<typename T>
  31. void Subject<T>::unsubscribe(Observer<T> *observer) {
  32. this->observers.remove(observer);
  33. }
  34.  
  35. template<typename T>
  36. void Subject<T>::notify(const T& data) {
  37. for (const auto &observer: this->observers) {
  38. observer->notify(data);
  39. }
  40. }
  41.  
  42. struct MoveData{};
  43. struct SteerData{};
  44.  
  45. class Car : public Subject<MoveData>, public Subject<SteerData> {
  46. public:
  47. void move() {
  48. const MoveData moveData{};
  49. this->Subject<MoveData>::notify(moveData);
  50. }
  51.  
  52. void steer() {
  53. const SteerData steerData{};
  54. this->Subject<SteerData>::notify(steerData);
  55. }
  56. };
  57.  
  58. struct MoveDataObserver : Observer<MoveData>
  59. {
  60. void notify(const MoveData&) override { std::cout << "MoveDataObserver\n"; }
  61. };
  62.  
  63. struct SteerDataObserver : Observer<SteerData>
  64. {
  65. void notify(const SteerData&) override { std::cout << "SteerDataObserver\n"; }
  66. };
  67.  
  68. int main()
  69. {
  70. Car car;
  71. MoveDataObserver obs1;
  72. SteerDataObserver obs2;
  73. car.Subject<MoveData>::subscribe(&obs1);
  74. car.Subject<SteerData>::subscribe(&obs2);
  75. car.move();
  76. car.steer();
  77. }
Success #stdin #stdout 0.01s 5268KB
stdin
Standard input is empty
stdout
MoveDataObserver
SteerDataObserver