最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++設(shè)計模式編程中的觀察者模式使用示例

 更新時間:2016年03月06日 09:48:01   作者:十八道胡同  
這篇文章主要介紹了C++設(shè)計模式編程中的觀察者模式使用示例,觀察者模式在被觀察者和觀察者之間建立一個抽象的耦合,需要的朋友可以參考下

概述:
最近中國股市起起伏伏,當(dāng)然了起伏就用商機,小明發(fā)現(xiàn)商機后果斷想入市,買入了中國證券,他想在電腦客戶端上,網(wǎng)頁上,手機上,iPad上都可以查看到該證券的實時行情,這種情況下我們應(yīng)該怎么設(shè)計我們的軟件呢?我們可以這樣:小明的所有客戶端上都訂閱中國證券這個股票,只要股票一有變化,所有的客戶端都會被通知到并且被自動更新。
這就是我們的觀察者模式,她定義對象間的一種一對多的依賴關(guān)系,當(dāng)一個對象的狀態(tài)發(fā)生改變時, 所有依賴于它的對象都得到通知并被自動更新。

類圖:

20163694653836.gif (375×305)

可以看出,在這個觀察者模式的實現(xiàn)里有下面這些角色:
抽象主題(Subject)角色:主題角色把所有對觀察考對象的引用保存在一個聚集里,每個主題都可以有任何數(shù)量的觀察者。抽象主題提供一個接口,可以增加和刪除觀察者對象,主題角色又叫做抽象被觀察者(Observable)角色,一般用一個抽象類或者一個接口實現(xiàn)。
抽象觀察者(Observer)角色:為所有的具體觀察者定義一個接口,在得到主題的通知時更新自己。這個接口叫做更新接口。抽象觀察者角色一般用一個抽象類或者一個接口實現(xiàn)。在這個示意性的實現(xiàn)中,更新接口只包含一個方法(即Update()方法),這個方法叫做更新方法。
具體主題(ConcreteSubject)角色:將有關(guān)狀態(tài)存入具體現(xiàn)察者對象;在具體主題的內(nèi)部狀態(tài)改變時,給所有登記過的觀察者發(fā)出通知。具體主題角色又叫做具體被觀察者角色(Concrete Observable)。具體主題角色通常用一個具體子類實現(xiàn)。
具體觀察者(ConcreteObserver)角色:存儲與主題的狀態(tài)自恰的狀態(tài)。具體現(xiàn)察者角色實現(xiàn)抽象觀察者角色所要求的更新接口,以便使本身的狀態(tài)與主題的狀態(tài)相協(xié)調(diào)。如果需要,具體現(xiàn)察者角色可以保存一個指向具體主題對象的引用。具體觀察者角色通常用一個具體子類實現(xiàn)。      
從具體主題角色指向抽象觀察者角色的合成關(guān)系,代表具體主題對象可以有任意多個對抽象觀察者對象的引用。之所以使用抽象觀察者而不是具體觀察者,意味著主題對象不需要知道引用了哪些ConcreteObserver類型,而只知道抽象Observer類型。這就使得具體主題對象可以動態(tài)地維護一系列的對觀察者對象的引用,并在需要的時候調(diào)用每一個觀察者共有的Update()方法。這種做法叫做"針對抽象編程"。

概念
觀察者模式是講有一個目標(biāo),眾多個觀察者去“觀察”目標(biāo)。目標(biāo)是目標(biāo)抽象類的一個派生類,觀察者是觀察者抽象類的一個派生類。當(dāng)目標(biāo)類的數(shù)據(jù)改變,所有對應(yīng)的觀察者對應(yīng)去更新自己的狀態(tài)
可以使用的情況:比如有一個世界時鐘程序,有多個圖形時鐘去顯示比如北京時區(qū),巴黎時區(qū),等等。如果設(shè)置一個北京時間,那么其他時鐘圖形都需要更新(加上或者減去時差值)。典型的圖形界面設(shè)計隨處可見,一個溫度程序,在溫度濕度等條件改變時,要更新多種顯示圖形來呈現(xiàn)。

實例
使用時,首先定義一個Subject的類對象,然后再定義多個Observer類(派生類)對象,每個Observer對象指定自己被注冊到哪個Subject對象內(nèi)。

示例:

#include<vector>
#include<iostream>
#include<string>
using namespace std;
 
class Subject;
 
class Observer{          //觀察者抽象類
public:
 virtual void update(Subject *base)=0;
protected:
 Subject * _subject;
};
 
class Subject{          //目標(biāo)抽象類
public:
 string s1;            //數(shù)據(jù)值,可以作為私有數(shù)據(jù),然后定義一個借口去返回值,這里為了省事
 int i1;               //數(shù)據(jù)值
 void regiObserver(Observer *obs){
  _observer.push_back(obs);
   cout<<"已注冊"<<endl;
 }
 void deleObserver(Observer *obs){
  _observer.pop_back();
 }
 void notify(){        //更新所有的觀察者
  vector<Observer *>::iterator it;
  for(it = _observer.begin(); it != _observer.end(); it++)
   (*it)->update(this);
 } 
private:
 vector<Observer *> _observer;    //觀察者容器
};
 
class FSubject:public Subject{        
public:
 void set(string s,int i){
  s1 = s;
  i1 = i;
  notify();                  //通知觀察者。主函數(shù)的執(zhí)行順序已經(jīng)保證了所有的觀察者都已經(jīng)進入容器內(nèi)
 }
};
 
class FObserver :public Observer{  //第一個觀察者派生類
public:
 FObserver(Subject *base):Observer(){
  _subject = base;
  _subject->regiObserver(this);
 }
 void update(Subject *base){
  s1 = base->s1;
  i1 = base->i1;
  display();
 }
 void display(){
  cout<<"更新值,第一個\n"<<s1<<endl;
  cout<<i1<<endl;
 }
private:
 string s1;
 int i1;
};
 
class SObserver:public Observer{  //第二個觀察者派生類
 public:
 SObserver(Subject * base){
  _subject = base;
  _subject->regiObserver(this);
 }
 void update(Subject *base){
  s1 = base->s1;
  i1 = base->i1;
  display();
 }
  void display(){
  cout<<"更新值,第二個\n"<<s1<<endl;
  cout<<i1<<endl;
 }
private:
 string s1;
 int i1;
};
 
int main()
{
 FSubject * sub = new FSubject;
 FObserver * one = new FObserver(sub);
 SObserver * two = new SObserver(sub);
 sub->set("ok",3);
 return 0;

}
 Subject 類中的容器對象維護者所有對觀察者的引用,目的是在notify中去更新所有的觀察者,即通過遍歷去調(diào)用觀察者->update()。

觀察者中的update()作用是完成觀察者需要完成的事,比如在上例中,去更新自身保存的副本值,然后并顯示出來。

Observer類中有一個Subject指針非常重要,在觀察者的派生類的構(gòu)造函數(shù),需要去把自身的this傳遞過去進行注冊。

Observer中有和Subject同樣的數(shù)據(jù),也可以設(shè)置為局部變量,僅僅是完成觀察者需要做的事就行,而不必存儲。

相關(guān)文章

  • C++?函數(shù)的介紹

    C++?函數(shù)的介紹

    本篇主要介紹了函數(shù)的基礎(chǔ)概念以及一些特殊的函數(shù)方法和類型,函數(shù)重載以及函數(shù)指針,下面一起進入文章學(xué)習(xí)詳細(xì)的內(nèi)容吧,需要的朋友也可以參考一下
    2021-12-12
  • C++超集C++/CLI模塊的基本類型

    C++超集C++/CLI模塊的基本類型

    這篇文章介紹了C++超集C++/CLI模塊的基本類型,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • C++編譯器和鏈接器工作原理及使用方法完全指南

    C++編譯器和鏈接器工作原理及使用方法完全指南

    本文將詳細(xì)介紹C++中的編譯器和鏈接器以及它們的工作原理及使用方法全面詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-05-05
  • C語言數(shù)據(jù)結(jié)構(gòu)與算法之鏈表(一)

    C語言數(shù)據(jù)結(jié)構(gòu)與算法之鏈表(一)

    鏈表是線性表的鏈?zhǔn)酱鎯Ψ绞?。鏈表的?nèi)存是不連續(xù)的,前一個元素存儲地址的下一個地址中存儲的不一定是下一個元素。小編今天就將帶大家深入了解一下鏈表,快來學(xué)習(xí)吧
    2021-12-12
  • C語言實現(xiàn)數(shù)組的循環(huán)移位的方法示例

    C語言實現(xiàn)數(shù)組的循環(huán)移位的方法示例

    這篇文章主要介紹了C語言實現(xiàn)數(shù)組的循環(huán)移位的方法示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • 常用Hash算法(C語言的簡單實現(xiàn))

    常用Hash算法(C語言的簡單實現(xiàn))

    下面小編就為大家?guī)硪黄S肏ash算法(C語言的簡單實現(xiàn))。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-09-09
  • 關(guān)于單片機按鍵問題性能提升總結(jié)

    關(guān)于單片機按鍵問題性能提升總結(jié)

    今天小編就為大家分享一篇關(guān)于關(guān)于單片機按鍵問題性能提升總結(jié),小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • C++?Boost?Format超詳細(xì)講解

    C++?Boost?Format超詳細(xì)講解

    Boost是為C++語言標(biāo)準(zhǔn)庫提供擴展的一些C++程序庫的總稱。Boost庫是一個可移植、提供源代碼的C++庫,作為標(biāo)準(zhǔn)庫的后備,是C++標(biāo)準(zhǔn)化進程的開發(fā)引擎之一,是為C++語言標(biāo)準(zhǔn)庫提供擴展的一些C++程序庫的總稱
    2022-11-11
  • 淺析c與c++中struct的區(qū)別

    淺析c與c++中struct的區(qū)別

    c與c++中struct的區(qū)別你是否了解,下面小編就詳細(xì)的為大家介紹一下
    2013-07-07
  • OpenCV實現(xiàn)拼圖算法

    OpenCV實現(xiàn)拼圖算法

    這篇文章主要為大家詳細(xì)介紹了OpenCV實現(xiàn)拼圖算法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07

最新評論

岑巩县| 九江市| 旌德县| 永修县| 五台县| 汉阴县| 黄石市| 邯郸县| 吉木乃县| 汝阳县| 嘉兴市| 武胜县| 潞城市| 尚义县| 沿河| 沁水县| 齐河县| 长岭县| 孟津县| 莱西市| 塔城市| 夏河县| 开阳县| 桐梓县| SHOW| 屯昌县| 治县。| 墨江| 资兴市| 中阳县| 犍为县| 洪洞县| 白玉县| 留坝县| 陈巴尔虎旗| 丁青县| 博客| 响水县| 都江堰市| 博野县| 吉林市|