|
@@ -0,0 +1,111 @@
|
|
|
|
|
+#ifndef __OBSERVER_PATTERN_H__
|
|
|
|
|
+#define __OBSERVER_PATTERN_H__
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+/*
|
|
|
|
|
+ 观察者模式(Observer Pattern)定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。当主题对象的状态发生变化时,它的所有依赖者(观察者)都会收到通知并自动更新。
|
|
|
|
|
+ 主要角色:
|
|
|
|
|
+ 1. 抽象主题(Subject):定义了注册、注销和通知观察者的方法。
|
|
|
|
|
+ 2. 具体主题(Concrete Subject):实现了抽象主题的方法,并维护一个观察者列表。
|
|
|
|
|
+ 3. 抽象观察者(Observer):定义了更新接口,供具体观察者实现。
|
|
|
|
|
+ 4. 具体观察者(Concrete Observer):实现了更新接口,以便在接收到通知时更新自身状态。
|
|
|
|
|
+ */
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+#include "spdlog/spdlog.h"
|
|
|
|
|
+#include <string>
|
|
|
|
|
+#include <list>
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+class AbstractObserver;
|
|
|
|
|
+
|
|
|
|
|
+/* 新闻社 */
|
|
|
|
|
+class AbstractNewsAgency
|
|
|
|
|
+{
|
|
|
|
|
+public:
|
|
|
|
|
+ AbstractNewsAgency() {}
|
|
|
|
|
+ virtual ~AbstractNewsAgency() {}
|
|
|
|
|
+ virtual void addObserver(AbstractObserver* observer);
|
|
|
|
|
+ virtual void removeObserver(AbstractObserver* observer);
|
|
|
|
|
+ virtual void notifyObservers(std::string news) = 0;
|
|
|
|
|
+protected:
|
|
|
|
|
+ std::list<AbstractObserver*> m_listObservers;
|
|
|
|
|
+};
|
|
|
|
|
+
|
|
|
|
|
+/* 摩根斯新闻社 */
|
|
|
|
|
+class MorgensNewsAgency : public AbstractNewsAgency
|
|
|
|
|
+{
|
|
|
|
|
+public:
|
|
|
|
|
+ virtual void notifyObservers(std::string news) override;
|
|
|
|
|
+
|
|
|
|
|
+};
|
|
|
|
|
+
|
|
|
|
|
+/* 八卦新闻社 */
|
|
|
|
|
+class GossipNewsAgency : public AbstractNewsAgency
|
|
|
|
|
+{
|
|
|
|
|
+public:
|
|
|
|
|
+ virtual void notifyObservers(std::string news) override;
|
|
|
|
|
+};
|
|
|
|
|
+
|
|
|
|
|
+/* 抽象订阅者 */
|
|
|
|
|
+class AbstractObserver
|
|
|
|
|
+{
|
|
|
|
|
+public:
|
|
|
|
|
+ AbstractObserver(std::string name, AbstractNewsAgency* agency)
|
|
|
|
|
+ : m_name(name), m_agency(agency)
|
|
|
|
|
+ {
|
|
|
|
|
+ m_agency->addObserver(this);
|
|
|
|
|
+ }
|
|
|
|
|
+ virtual ~AbstractObserver()
|
|
|
|
|
+ {
|
|
|
|
|
+ m_agency->removeObserver(this);
|
|
|
|
|
+ }
|
|
|
|
|
+ virtual void update(std::string& news) = 0;
|
|
|
|
|
+ virtual void unSubscribe() {
|
|
|
|
|
+ m_agency->removeObserver(this);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+protected:
|
|
|
|
|
+ std::string m_name;
|
|
|
|
|
+ AbstractNewsAgency* m_agency;
|
|
|
|
|
+
|
|
|
|
|
+};
|
|
|
|
|
+
|
|
|
|
|
+class Dragon : public AbstractObserver
|
|
|
|
|
+{
|
|
|
|
|
+public:
|
|
|
|
|
+ using AbstractObserver::AbstractObserver;
|
|
|
|
|
+ void update(std::string& msg) override
|
|
|
|
|
+ {
|
|
|
|
|
+ SPDLOG_INFO("@@@路飞的老爸革命军龙收到消息: {}", msg);
|
|
|
|
|
+ }
|
|
|
|
|
+};
|
|
|
|
|
+
|
|
|
|
|
+class Shanks : public AbstractObserver
|
|
|
|
|
+{
|
|
|
|
|
+public:
|
|
|
|
|
+ using AbstractObserver::AbstractObserver;
|
|
|
|
|
+ void update(std::string& msg) override
|
|
|
|
|
+ {
|
|
|
|
|
+ SPDLOG_INFO("@@@路飞的引路人红发香克斯收到消息: {}", msg);
|
|
|
|
|
+ }
|
|
|
|
|
+};
|
|
|
|
|
+
|
|
|
|
|
+class Bartolomeo : public AbstractObserver
|
|
|
|
|
+{
|
|
|
|
|
+public:
|
|
|
|
|
+ using AbstractObserver::AbstractObserver;
|
|
|
|
|
+ void update(std::string& msg) override
|
|
|
|
|
+ {
|
|
|
|
|
+ SPDLOG_INFO("@@@路飞的头号粉丝巴托洛米奥收到消息: {}", msg);
|
|
|
|
|
+ }
|
|
|
|
|
+};
|
|
|
|
|
+
|
|
|
|
|
+void testObserverPattern();
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+#endif // __OBSERVER_PATTERN_H__
|