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

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

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

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

類圖:

20163694653836.gif (375×305)

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

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

實(shí)例
使用時(shí),首先定義一個(gè)Subject的類對(duì)象,然后再定義多個(gè)Observer類(派生類)對(duì)象,每個(gè)Observer對(duì)象指定自己被注冊(cè)到哪個(gè)Subject對(duì)象內(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ù),然后定義一個(gè)借口去返回值,這里為了省事
 int i1;               //數(shù)據(jù)值
 void regiObserver(Observer *obs){
  _observer.push_back(obs);
   cout<<"已注冊(cè)"<<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)進(jìn)入容器內(nèi)
 }
};
 
class FObserver :public Observer{  //第一個(gè)觀察者派生類
public:
 FObserver(Subject *base):Observer(){
  _subject = base;
  _subject->regiObserver(this);
 }
 void update(Subject *base){
  s1 = base->s1;
  i1 = base->i1;
  display();
 }
 void display(){
  cout<<"更新值,第一個(gè)\n"<<s1<<endl;
  cout<<i1<<endl;
 }
private:
 string s1;
 int i1;
};
 
class SObserver:public Observer{  //第二個(gè)觀察者派生類
 public:
 SObserver(Subject * base){
  _subject = base;
  _subject->regiObserver(this);
 }
 void update(Subject *base){
  s1 = base->s1;
  i1 = base->i1;
  display();
 }
  void display(){
  cout<<"更新值,第二個(gè)\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 類中的容器對(duì)象維護(hù)者所有對(duì)觀察者的引用,目的是在notify中去更新所有的觀察者,即通過(guò)遍歷去調(diào)用觀察者->update()。

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

Observer類中有一個(gè)Subject指針?lè)浅V匾谟^察者的派生類的構(gòu)造函數(shù),需要去把自身的this傳遞過(guò)去進(jìn)行注冊(cè)。

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

相關(guān)文章

  • C++初始化函數(shù)列表詳細(xì)解析

    C++初始化函數(shù)列表詳細(xì)解析

    C++可以定義引用類型的成員變量,引用類型的成員變量必須在構(gòu)造函數(shù)的初始化列表中進(jìn)行初始化
    2013-09-09
  • 詳細(xì)理解函C語(yǔ)言的函數(shù)棧幀

    詳細(xì)理解函C語(yǔ)言的函數(shù)棧幀

    這篇文章主要為大家介紹了C語(yǔ)言的函數(shù)棧幀,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助,希望能夠給你帶來(lái)幫助
    2021-11-11
  • C++實(shí)現(xiàn)當(dāng)前時(shí)間動(dòng)態(tài)顯示的方法

    C++實(shí)現(xiàn)當(dāng)前時(shí)間動(dòng)態(tài)顯示的方法

    這篇文章主要介紹了C++實(shí)現(xiàn)當(dāng)前時(shí)間動(dòng)態(tài)顯示的方法,涉及C++時(shí)間操作及Sleep方法的使用,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-07-07
  • C++短路求值(邏輯與、邏輯或)實(shí)例

    C++短路求值(邏輯與、邏輯或)實(shí)例

    這篇文章主要介紹了C++短路求值(邏輯與、邏輯或)實(shí)例,以實(shí)例形式講述了邏輯或的短路與邏輯與的短路及相應(yīng)的應(yīng)用實(shí)例,需要的朋友可以參考下
    2014-10-10
  • C++ 智能指針的模擬實(shí)現(xiàn)實(shí)例

    C++ 智能指針的模擬實(shí)現(xiàn)實(shí)例

    這篇文章主要介紹了C++ 智能指針的模擬實(shí)現(xiàn)實(shí)例的相關(guān)資料,智能指針是一個(gè)類,它把普通指針?lè)庋b起來(lái),能實(shí)現(xiàn)和普通指針同樣的功能。,需要的朋友可以參考下
    2017-07-07
  • C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之動(dòng)態(tài)分配實(shí)現(xiàn)串

    C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之動(dòng)態(tài)分配實(shí)現(xiàn)串

    這篇文章主要介紹了C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之動(dòng)態(tài)分配實(shí)現(xiàn)串的相關(guān)資料,希望通過(guò)本文能幫助到大家,讓大家實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)中動(dòng)態(tài)分配實(shí)現(xiàn)串的實(shí)例,需要的朋友可以參考下
    2017-10-10
  • 深入探索C++ string的底層實(shí)現(xiàn)

    深入探索C++ string的底層實(shí)現(xiàn)

    C語(yǔ)言中的字符串是以字符數(shù)組的形式存儲(chǔ)的,每個(gè)字符占用一個(gè)字節(jié)的內(nèi)存空間,本文我們將和大家一起深入探討一下string的底層實(shí)現(xiàn),感興趣的小伙伴快來(lái)和小編一起吧
    2023-08-08
  • C語(yǔ)言實(shí)現(xiàn)消消樂(lè)小游戲

    C語(yǔ)言實(shí)現(xiàn)消消樂(lè)小游戲

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)消消樂(lè)小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • C++11 并發(fā)指南之std::mutex詳解

    C++11 并發(fā)指南之std::mutex詳解

    這篇文章主要介紹了C++11 并發(fā)指南之std::mutex詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • C++使用boost::lexical_cast進(jìn)行數(shù)值轉(zhuǎn)換

    C++使用boost::lexical_cast進(jìn)行數(shù)值轉(zhuǎn)換

    這篇文章介紹了C++使用boost::lexical_cast進(jìn)行數(shù)值轉(zhuǎn)換的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06

最新評(píng)論