欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

觀察者模式通常的叫法叫做訂閱-發(fā)布模式,類似于報刊雜志的訂閱,觀察者和被觀察者就是讀者和郵局的關系,讀者先要在郵局訂閱想要的報刊,當報刊發(fā)行時,郵局會將報刊郵寄到讀者家里。觀察者(Observer)和被觀察者(Listener)也是這種關系,Observer將自己attach到Listener中,當Listener觸發(fā)時Notify所有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實現消息分發(fā)即可。當然也可以虛化,將這一系列的操作放到子類進行實現。
調用者應該注意在多線程環(huán)境中的使用環(huán)境,做好數據的同步工作。

應用場景

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

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

相關文章

  • C++中的RAII機制詳解

    C++中的RAII機制詳解

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

    C++類和對象到底是什么

    C++ 是一門面向對象的編程語言,理解 C++,首先要理解類(Class)和對象(Object)這兩個概念。下面和小編一起來學習吧
    2021-09-09
  • C語言?超詳細總結講解二叉樹的概念與使用

    C語言?超詳細總結講解二叉樹的概念與使用

    二叉樹可以簡單理解為對于一個節(jié)點來說,最多擁有一個上級節(jié)點,同時最多具備左右兩個下級節(jié)點的數據結構。本文將詳細介紹一下C++中二叉樹的概念和結構,需要的可以參考一下
    2022-04-04
  • C++類與對象的重點知識點詳細分析

    C++類與對象的重點知識點詳細分析

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

    C++簡單又輕松的講解類和對象中友元函數

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

    C語言數據類型枚舉enum全面詳解示例教程

    生活中有很多地方會用到枚舉,比如一周有7天,可以一一枚舉;性別有男、女...等等都可以可以一一枚舉,今天來和筆者一起學習一下c語言枚舉吧
    2021-10-10
  • OpenCV實現霍夫變換直線檢測

    OpenCV實現霍夫變換直線檢測

    這篇文章主要為大家詳細介紹了OpenCV實現霍夫變換直線檢測,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • C語言線性表順序存儲結構實例詳解

    C語言線性表順序存儲結構實例詳解

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

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

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

    C++控制臺實現掃雷游戲

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

最新評論