设计模式C++版:第二十一式观察者模式

xiaoxiao2021-02-27  159

观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够自动更新自己。

示例代码如下:

#pragma once #include <iostream> #include <list> #include <string> using std::string; using std::list; class Subject; //观察者接口 class Observer { public: Observer(const string &name, Subject *sub =nullptr) { m_name = name; m_sub = sub; } virtual void Update(){} virtual ~Observer() { } protected: string m_name; Subject* m_sub; }; class StockObserver :public Observer { public: StockObserver(const string &name, Subject *sub=nullptr) :Observer(name, sub) { } virtual void Update() { std::cout << m_name << "关闭股票软件,继续工作" << std::endl; } }; class NBAObserver :public Observer { public: NBAObserver(const string &name, Subject* sub=nullptr) :Observer(name, sub) { } virtual void Update() { std::cout << m_name << "关闭NBA直播,继续工作" << std::endl; } }; //通知者接口 class Subject { public: virtual void Attach(Observer* observer){} virtual void Detch(Observer* observer){} void Notify(){} virtual ~Subject(){} }; class Boss :public Subject { public: virtual void Attach(Observer* observer) { if (observer!=nullptr) { m_obslist.push_front(observer); } } virtual void Detch(Observer* observer) { if (observer!=nullptr) { m_obslist.remove(observer); } } void Notify() { if (!m_obslist.empty()) { for each (Observer* var in m_obslist) { var->Update(); } } } ~Boss() { if (!m_obslist.empty()) { m_obslist.clear(); } } void putout() { std::cout << "观察者数量为 "<<m_obslist.size() << std::endl; } private: list<Observer*> m_obslist; }; int main() { Boss huhansan; huhansan.putout(); //观察者注册给通知者 const string name1 = "看股票的"; const string name2 = "看nba的"; Observer* ts1 = new StockObserver(name1); Observer*ts2 = new NBAObserver(name2); //通知者添加观察者对象 huhansan.Attach(ts1); huhansan.Attach(ts2); huhansan.Notify(); std::cout << "胡汉三第二天过来" << std::endl; huhansan.Detch(ts1); //huhansan.Detch(ts2); huhansan.Notify(); delete ts1; delete ts2; return 0; }

转载请注明原文地址: https://www.6miu.com/read-13729.html

最新回复(0)