雷火电竞-中国电竞赛事及体育赛事平台

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

C語言

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

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

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

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

作用

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

類視圖

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

應(yīng)用場景

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

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

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

欄    目:C語言

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

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

本文地址:http://www.jygsgssxh.com/a1/Cyuyan/841.html

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

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

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

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