#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 #include 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 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__