亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

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

2020-01-26 14:42:48
字體:
來源:轉載
供稿:網友

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

類圖:

20163694653836.gif (375×305)

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

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

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

示例:

#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{          //目標抽象類public: string s1;            //數據值,可以作為私有數據,然后定義一個借口去返回值,這里為了省事 int i1;               //數據值 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();                  //通知觀察者。主函數的執行順序已經保證了所有的觀察者都已經進入容器內 }}; 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中去更新所有的觀察者,即通過遍歷去調用觀察者->update()。

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

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

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲自拍av在线| 亚洲人永久免费| 欧美日韩国产第一页| 欧美三级免费观看| 亚洲另类图片色| 国产日韩欧美黄色| 精品国产依人香蕉在线精品| 亚洲欧美日韩成人| 久久天天躁狠狠躁夜夜av| 97碰在线观看| 欧美一区在线直播| 国产亚洲精品日韩| 日韩av123| 久久深夜福利免费观看| 日韩风俗一区 二区| 日韩中文字幕免费| 91成人天堂久久成人| 亚洲精品国产精品久久清纯直播| 亚洲韩国日本中文字幕| 欧美激情第一页xxx| 裸体女人亚洲精品一区| 欧美电影免费观看网站| 久久亚洲国产精品成人av秋霞| 欧美大片在线看免费观看| 国产不卡在线观看| 欧美激情久久久久久| 国产精品久久久久久婷婷天堂| 国产欧美精品日韩精品| 亚洲精品成人免费| 国产成人精彩在线视频九色| 成人黄色网免费| 欧美日韩美女在线观看| 精品视频一区在线视频| 最好看的2019年中文视频| 国产一区视频在线| 在线电影av不卡网址| 高清亚洲成在人网站天堂| 日韩精品在线免费观看| 草民午夜欧美限制a级福利片| 色婷婷久久一区二区| 中文字幕亚洲欧美日韩在线不卡| 欧美日韩999| 一区二区在线视频| 国产精品久久久久久久久久久新郎| 色av中文字幕一区| 精品福利一区二区| 国产精品成人一区二区三区吃奶| 欧美成人久久久| 日本午夜精品理论片a级appf发布| 亚洲风情亚aⅴ在线发布| 91免费人成网站在线观看18| 亚洲欧美日韩在线高清直播| 国产成人精品日本亚洲专区61| yellow中文字幕久久| 亚洲色无码播放| 91久久中文字幕| 国产精品视频成人| 精品视频久久久久久| 亚洲视频一区二区三区| 国语自产精品视频在线看抢先版图片| 国产精品自拍偷拍| 日韩大片在线观看视频| 亚洲欧美另类自拍| 久久国产精品首页| 亚洲精品成人久久电影| 日韩av男人的天堂| 久久久精品网站| 久久久在线视频| 亚洲电影免费在线观看| 久久久久亚洲精品| 97在线视频一区| 国产精品露脸av在线| 国产不卡在线观看| 国产一区二区三区高清在线观看| 欧美精品生活片| 亚洲国产另类久久精品| 欧美精品福利视频| 亚洲一区二区中文字幕| 日韩亚洲欧美成人| 日韩美女在线观看一区| 欧美影院久久久| 亚洲毛片在线免费观看| 日韩激情视频在线播放| 91精品国产乱码久久久久久蜜臀| 97碰在线观看| 国产精品一区二区3区| 97久久超碰福利国产精品…| 国产亚洲精品久久久优势| 91av在线视频观看| 国产丝袜视频一区| 伦伦影院午夜日韩欧美限制| 亚洲va欧美va国产综合剧情| 国产视频精品一区二区三区| 国产精品wwww| 亚洲欧美中文日韩在线v日本| 国产精品对白刺激| 日韩免费在线看| 国产在线久久久| 欧美成人激情图片网| 在线播放国产一区中文字幕剧情欧美| 国产视频在线观看一区二区| 欧美成人激情图片网| 7777精品久久久久久| 亚洲人成啪啪网站| 97热精品视频官网| 欧美激情精品久久久久久免费印度| 日韩中文字幕在线| 中文字幕在线看视频国产欧美| 亚洲老司机av| 亚洲级视频在线观看免费1级| 性欧美在线看片a免费观看| 欧美日韩一区免费| 97视频在线看| 欧美电影在线观看| 日本高清+成人网在线观看| 亚洲欧美日韩天堂| 68精品国产免费久久久久久婷婷| 国产精品人成电影在线观看| 日韩欧美在线国产| 秋霞成人午夜鲁丝一区二区三区| 91久久久久久久一区二区| 亚洲欧美国产精品久久久久久久| 日韩免费观看av| 亚洲影院色无极综合| 国产精品成人一区二区| 久久久亚洲欧洲日产国码aⅴ| 国产在线观看一区二区三区| 亚洲国产成人在线播放| 78m国产成人精品视频| 黄色精品在线看| 久久久久久久久91| 亚洲欧洲国产伦综合| 国产精品一区二区电影| 国产精品久久久久91| 久久久成人精品| 精品久久久久久久久久国产| 中文字幕在线国产精品| 日韩欧中文字幕| 欧美激情第99页| 精品欧美国产一区二区三区| 中日韩美女免费视频网址在线观看| 日韩在线视频导航| 国产精品va在线| 精品人伦一区二区三区蜜桃免费| 黑人极品videos精品欧美裸| 国产91精品不卡视频| 91成人国产在线观看| 最近免费中文字幕视频2019| 亚洲视频网站在线观看| 欧美重口另类videos人妖| 日韩av影视综合网| 国产精品欧美风情| 欧美大荫蒂xxx| 91视频国产一区| 91久久久久久久一区二区| 亚洲第一男人天堂| 亚洲欧美激情另类校园| 91视频国产一区| 国产精品亚洲第一区| 国产精品99久久99久久久二8| 国产原创欧美精品| 亚洲欧美在线免费观看| 亚洲成人a级网| 欧美电影在线观看网站|