亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

 更新時(shí)間:2018年04月07日 10:57:48   作者:chencarl  
這篇文章主要為大家詳細(xì)介紹了C++設(shè)計(jì)模式之觀察者模式Observer,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

觀察者模式通常的叫法叫做訂閱-發(fā)布模式,類(lèi)似于報(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)系。

類(lèi)視圖

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

應(yīng)用場(chǎng)景

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

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

相關(guān)文章

  • C++中的RAII機(jī)制詳解

    C++中的RAII機(jī)制詳解

    這篇文章主要介紹了C++中的RAII機(jī)制詳解,RAII是Resource Acquisition Is Initialization的簡(jiǎn)稱,是C++語(yǔ)言的一種管理資源、避免泄漏的慣用法,需要的朋友可以參考下
    2014-09-09
  • C++類(lèi)和對(duì)象到底是什么

    C++類(lèi)和對(duì)象到底是什么

    C++ 是一門(mén)面向?qū)ο蟮木幊陶Z(yǔ)言,理解 C++,首先要理解類(lèi)(Class)和對(duì)象(Object)這兩個(gè)概念。下面和小編一起來(lái)學(xué)習(xí)吧
    2021-09-09
  • C語(yǔ)言?超詳細(xì)總結(jié)講解二叉樹(shù)的概念與使用

    C語(yǔ)言?超詳細(xì)總結(jié)講解二叉樹(shù)的概念與使用

    二叉樹(shù)可以簡(jiǎn)單理解為對(duì)于一個(gè)節(jié)點(diǎn)來(lái)說(shuō),最多擁有一個(gè)上級(jí)節(jié)點(diǎn),同時(shí)最多具備左右兩個(gè)下級(jí)節(jié)點(diǎn)的數(shù)據(jù)結(jié)構(gòu)。本文將詳細(xì)介紹一下C++中二叉樹(shù)的概念和結(jié)構(gòu),需要的可以參考一下
    2022-04-04
  • C++類(lèi)與對(duì)象的重點(diǎn)知識(shí)點(diǎn)詳細(xì)分析

    C++類(lèi)與對(duì)象的重點(diǎn)知識(shí)點(diǎn)詳細(xì)分析

    類(lèi)和對(duì)象是兩種以計(jì)算機(jī)為載體的計(jì)算機(jī)語(yǔ)言的合稱。對(duì)象是對(duì)客觀事物的抽象,類(lèi)是對(duì)對(duì)象的抽象。類(lèi)是一種抽象的數(shù)據(jù)類(lèi)型;變量就是可以變化的量,存儲(chǔ)在內(nèi)存中—個(gè)可以擁有在某個(gè)范圍內(nèi)的可變存儲(chǔ)區(qū)域
    2023-02-02
  • C++簡(jiǎn)單又輕松的講解類(lèi)和對(duì)象中友元函數(shù)

    C++簡(jiǎn)單又輕松的講解類(lèi)和對(duì)象中友元函數(shù)

    采用類(lèi)的機(jī)制后實(shí)現(xiàn)了數(shù)據(jù)的隱藏與封裝,類(lèi)的數(shù)據(jù)成員一般定義為私有成員,成員函數(shù)一般定義為公有的,依此提供類(lèi)與外界間的通信接口。但是,有時(shí)需要定義一些函數(shù),這些函數(shù)不是類(lèi)的一部分,但又需要頻繁地訪問(wèn)類(lèi)的數(shù)據(jù)成員,這時(shí)可以將這些函數(shù)定義為該類(lèi)的友元函數(shù)
    2022-06-06
  • C語(yǔ)言數(shù)據(jù)類(lèi)型枚舉enum全面詳解示例教程

    C語(yǔ)言數(shù)據(jù)類(lèi)型枚舉enum全面詳解示例教程

    生活中有很多地方會(huì)用到枚舉,比如一周有7天,可以一一枚舉;性別有男、女...等等都可以可以一一枚舉,今天來(lái)和筆者一起學(xué)習(xí)一下c語(yǔ)言枚舉吧
    2021-10-10
  • OpenCV實(shí)現(xiàn)霍夫變換直線檢測(cè)

    OpenCV實(shí)現(xiàn)霍夫變換直線檢測(cè)

    這篇文章主要為大家詳細(xì)介紹了OpenCV實(shí)現(xiàn)霍夫變換直線檢測(cè),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • C語(yǔ)言線性表順序存儲(chǔ)結(jié)構(gòu)實(shí)例詳解

    C語(yǔ)言線性表順序存儲(chǔ)結(jié)構(gòu)實(shí)例詳解

    這篇文章主要介紹了C語(yǔ)言線性表順序存儲(chǔ)結(jié)構(gòu)實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • 使用Inotify 監(jiān)控目錄與文件的方法詳解

    使用Inotify 監(jiān)控目錄與文件的方法詳解

    本篇文章是對(duì)使用Inotify 監(jiān)控目錄與文件的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C++控制臺(tái)實(shí)現(xiàn)掃雷游戲

    C++控制臺(tái)實(shí)現(xiàn)掃雷游戲

    這篇文章主要為大家詳細(xì)介紹了C++控制臺(tái)實(shí)現(xiàn)掃雷游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05

最新評(píng)論