国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

C++設計模式之觀察者模式(Observer)

2020-05-23 13:34:51
字體:
來源:轉載
供稿:網友

觀察者模式通常的叫法叫做訂閱-發布模式,類似于報刊雜志的訂閱,觀察者和被觀察者就是讀者和郵局的關系,讀者先要在郵局訂閱想要的報刊,當報刊發行時,郵局會將報刊郵寄到讀者家里。觀察者(Observer)和被觀察者(Listener)也是這種關系,Observer將自己attach到Listener中,當Listener觸發時Notify所有Observer.

作用

在觀察者模式中,被觀察者維護觀察者對象的集合,當被觀察者對象變化時,它會通知觀察者。觀察者模式主要是用于解決對象之間一對多的關系。

類視圖

C++,設計模式,觀察者模式,Observer

實現

class Observer {public:  virtual ~Observer() {};  virtual void Update(const std::string &msg)= 0; protected:  Observer(){};};class Listener{public:  virtual ~Listener() {};  void attach(Observer* obsvr)   {    m_observers.push_back(obsvr);  }  void remove(Observer* obsvr)  {    m_observers.remove(obsvr);  }  void notify(const std::string &msg)  {    list<Observer*>::iterator iter = m_observers.begin();     for(; iter != m_observers.end(); iter++)       (*iter)->Update(msg);   }private:   list<Observer* > m_observers; //觀察者鏈表 };class logRunner : public Listener{public:  virtual ~logRunner(){};  void addmsg(const std::string &msg)  {    nofity(msg);  }}class logGui : public Observer{public:  virtual ~Observer(){};  void Update(const std::string &msg)  {    cout<< "Gui log show : "<< msg <<endl;  }}class logFile : public Observer{public:  virtual ~Observer(){};  void Update(const std::string &msg)  {    cout<< "file log write : "<< msg <<endl;  }}class logDebug : public Observer{public:  virtual ~Observer(){};  void Update(const std::string &msg)  {    cout<< "Debug log out : "<< msg <<endl;  }}class logDataBase : public Observer{public:  virtual ~Observer(){};  void Update(const std::string &msg)  {    cout<< "DataBase log in : "<< msg <<endl;  }}int main(){  logRunner Runner;  logGui gGui;  logFile gFile;  logDebug gDebug;  logDataBase gDataBase;    Runner.attach(&gGui);  Runner.attach(&gFile);  Runner.attach(&gDebug);  Runner.attach(&gDataBase);    Runner.addmsg("app is setup");}

Observer中update一般為純虛,通過子類各自實現,這里只是保證調用的接口一致,Listener中的attach、remove、notify一般建議不進行虛化,子類不用關心其內部的聚合內容,通過調用notify實現消息分發即可。當然也可以虛化,將這一系列的操作放到子類進行實現。
調用者應該注意在多線程環境中的使用環境,做好數據的同步工作。

應用場景

  • 當一個對象改變需要通知到其他對象,而我們不確定由多少對象需要通知時;
  • 當一個對象必須通知其他對象,而不需要知道對象是什么實現時;
  • 對于一堆對象,包含同樣的狀態或同樣的數據,通過同一個條件進行更新時。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 嘉兴市| 玉环县| 南川市| 天柱县| 清苑县| 奉贤区| 清徐县| 巴里| 宜昌市| 鄢陵县| 乐清市| 义马市| 岳阳县| 蒙山县| 上林县| 那坡县| 逊克县| 房产| 新营市| 辛集市| 鄂温| 屏边| 乐昌市| 榆社县| 康乐县| 崇仁县| 吉隆县| 安国市| 嘉定区| 安福县| 潼南县| 临高县| 海口市| 云和县| 公主岭市| 阿尔山市| 烟台市| 东兰县| 天水市| 黑山县| 西平县|