ObserverPattern.h 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. #ifndef __OBSERVER_PATTERN_H__
  2. #define __OBSERVER_PATTERN_H__
  3. /*
  4. 观察者模式(Observer Pattern)定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。当主题对象的状态发生变化时,它的所有依赖者(观察者)都会收到通知并自动更新。
  5. 主要角色:
  6. 1. 抽象主题(Subject):定义了注册、注销和通知观察者的方法。
  7. 2. 具体主题(Concrete Subject):实现了抽象主题的方法,并维护一个观察者列表。
  8. 3. 抽象观察者(Observer):定义了更新接口,供具体观察者实现。
  9. 4. 具体观察者(Concrete Observer):实现了更新接口,以便在接收到通知时更新自身状态。
  10. */
  11. #include "spdlog/spdlog.h"
  12. #include <string>
  13. #include <list>
  14. class AbstractObserver;
  15. /* 新闻社 */
  16. class AbstractNewsAgency
  17. {
  18. public:
  19. AbstractNewsAgency() {}
  20. virtual ~AbstractNewsAgency() {}
  21. virtual void addObserver(AbstractObserver* observer);
  22. virtual void removeObserver(AbstractObserver* observer);
  23. virtual void notifyObservers(std::string news) = 0;
  24. protected:
  25. std::list<AbstractObserver*> m_listObservers;
  26. };
  27. /* 摩根斯新闻社 */
  28. class MorgensNewsAgency : public AbstractNewsAgency
  29. {
  30. public:
  31. virtual void notifyObservers(std::string news) override;
  32. };
  33. /* 八卦新闻社 */
  34. class GossipNewsAgency : public AbstractNewsAgency
  35. {
  36. public:
  37. virtual void notifyObservers(std::string news) override;
  38. };
  39. /* 抽象订阅者 */
  40. class AbstractObserver
  41. {
  42. public:
  43. AbstractObserver(std::string name, AbstractNewsAgency* agency)
  44. : m_name(name), m_agency(agency)
  45. {
  46. m_agency->addObserver(this);
  47. }
  48. virtual ~AbstractObserver()
  49. {
  50. m_agency->removeObserver(this);
  51. }
  52. virtual void update(std::string& news) = 0;
  53. virtual void unSubscribe() {
  54. m_agency->removeObserver(this);
  55. }
  56. protected:
  57. std::string m_name;
  58. AbstractNewsAgency* m_agency;
  59. };
  60. class Dragon : public AbstractObserver
  61. {
  62. public:
  63. using AbstractObserver::AbstractObserver;
  64. void update(std::string& msg) override
  65. {
  66. SPDLOG_INFO("@@@路飞的老爸革命军龙收到消息: {}", msg);
  67. }
  68. };
  69. class Shanks : public AbstractObserver
  70. {
  71. public:
  72. using AbstractObserver::AbstractObserver;
  73. void update(std::string& msg) override
  74. {
  75. SPDLOG_INFO("@@@路飞的引路人红发香克斯收到消息: {}", msg);
  76. }
  77. };
  78. class Bartolomeo : public AbstractObserver
  79. {
  80. public:
  81. using AbstractObserver::AbstractObserver;
  82. void update(std::string& msg) override
  83. {
  84. SPDLOG_INFO("@@@路飞的头号粉丝巴托洛米奥收到消息: {}", msg);
  85. }
  86. };
  87. void testObserverPattern();
  88. #endif // __OBSERVER_PATTERN_H__