欧美大屁股bbbbxxxx,狼人大香伊蕉国产www亚洲,男ji大巴进入女人的视频小说,男人把ji大巴放进女人免费视频,免费情侣作爱视频

歡迎來到入門教程網(wǎng)!

C語言

當(dāng)前位置:主頁 > 軟件編程 > C語言 >

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

來源:本站原創(chuàng)|時間:2020-01-10|欄目:C語言|點擊: 次

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

作用

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

類視圖

實現(xiàn)

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一般為純虛,通過子類各自實現(xiàn),這里只是保證調(diào)用的接口一致,Listener中的attach、remove、notify一般建議不進行虛化,子類不用關(guān)心其內(nèi)部的聚合內(nèi)容,通過調(diào)用notify實現(xiàn)消息分發(fā)即可。當(dāng)然也可以虛化,將這一系列的操作放到子類進行實現(xiàn)。
調(diào)用者應(yīng)該注意在多線程環(huán)境中的使用環(huán)境,做好數(shù)據(jù)的同步工作。

應(yīng)用場景

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

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持我們。

上一篇:詳解C++-(=)賦值操作符、智能指針編寫

欄    目:C語言

下一篇:利用C/C++實現(xiàn)較完整貪吃蛇游戲

本文標(biāo)題:C++設(shè)計模式之觀察者模式(Observer)

本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/841.html

網(wǎng)頁制作CMS教程網(wǎng)絡(luò)編程軟件編程腳本語言數(shù)據(jù)庫服務(wù)器

如果侵犯了您的權(quán)利,請與我們聯(lián)系,我們將在24小時內(nèi)進行處理、任何非本站因素導(dǎo)致的法律后果,本站均不負任何責(zé)任。

聯(lián)系QQ:835971066 | 郵箱:835971066#qq.com(#換成@)

Copyright © 2002-2020 腳本教程網(wǎng) 版權(quán)所有