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