Browse Source

V1.1.6
1、设计模式新增观察者模式

Apple 2 ngày trước cách đây
mục cha
commit
bbf97cc1ef

+ 2 - 0
demo/DesignerPattern/CMakeLists.txt

@@ -18,6 +18,7 @@ file(GLOB LOCAL_SRC
     ${CMAKE_CURRENT_SOURCE_DIR}/Combination/*.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/CommandModel/*.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/MediatorPattern/*.cpp
+    ${CMAKE_CURRENT_SOURCE_DIR}/ObserverPattern/*.cpp
 )
 
 
@@ -46,6 +47,7 @@ target_include_directories(${this_exe} PRIVATE
     ${CMAKE_CURRENT_SOURCE_DIR}/Combination
     ${CMAKE_CURRENT_SOURCE_DIR}/CommandModel
     ${CMAKE_CURRENT_SOURCE_DIR}/MediatorPattern
+    ${CMAKE_CURRENT_SOURCE_DIR}/ObserverPattern
 )
 
 target_link_libraries(${this_exe} PRIVATE

+ 58 - 0
demo/DesignerPattern/ObserverPattern/ObserverPattern.cpp

@@ -0,0 +1,58 @@
+#include "ObserverPattern.h"
+
+
+
+
+void AbstractNewsAgency::addObserver(AbstractObserver* observer)
+{
+    m_listObservers.push_back(observer);
+}
+
+void AbstractNewsAgency::removeObserver(AbstractObserver* observer)
+{
+    m_listObservers.remove(observer);
+}
+
+
+void MorgensNewsAgency::notifyObservers(std::string news)
+{
+    SPDLOG_INFO("摩根斯新闻社报纸的订阅者一共有: {} 位", m_listObservers.size());
+    for (auto observer : m_listObservers)
+    {
+        observer->update(news);
+    }
+}
+
+void GossipNewsAgency::notifyObservers(std::string news)
+{
+    SPDLOG_INFO("八卦新闻社报纸的订阅者一共有: {} 位", m_listObservers.size());
+    for (auto observer : m_listObservers)
+    {
+        observer->update(news);
+    }
+}
+
+
+
+void testObserverPattern()
+{
+    /* 创建新闻社 */
+    MorgensNewsAgency* morgensAgency = new MorgensNewsAgency();
+    GossipNewsAgency* gossipAgency = new GossipNewsAgency();
+    /* 创建订阅者 */
+    AbstractObserver* observerA = new Dragon("蒙奇·D·龙", morgensAgency);
+    AbstractObserver* observerB = new Shanks("香克斯", morgensAgency);
+    AbstractObserver* observerC = new Bartolomeo("巴托洛米奥", gossipAgency);
+
+    /* 发布新闻 */
+    morgensAgency->notifyObservers("蒙奇·D·路飞成为新世界的新的四皇之一, 赏金30亿贝里!!!");
+    SPDLOG_INFO("=========================================");
+    gossipAgency->notifyObservers("女帝汉库克想要嫁给路飞, 给路飞生猴子, 哈哈哈...");
+
+    delete observerA;
+    delete observerB;
+    delete observerC;
+    delete morgensAgency;
+    delete gossipAgency;
+}
+

+ 111 - 0
demo/DesignerPattern/ObserverPattern/ObserverPattern.h

@@ -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__

+ 4 - 1
demo/DesignerPattern/main.cpp

@@ -12,6 +12,7 @@
 #include "FlyWeight/FlyWeifht.h"
 #include "CommandModel/CommandModel.h"
 #include "MediatorPattern/MediatorPattern.h"
+#include "ObserverPattern/ObserverPattern.h"
 
 
 int main(int argc, char *argv[])
@@ -57,7 +58,9 @@ int main(int argc, char *argv[])
 
     // CommandModel::useRemoteControl();
 
-    MediatorPattern::testMediatorPattern();
+    // MediatorPattern::testMediatorPattern();
+
+    testObserverPattern();
 
     return a.exec();
 }