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

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

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

2020-05-23 14:08:34
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了C++設計模式編程中的觀察者模式使用示例,觀察者模式在被觀察者和觀察者之間建立一個抽象的耦合,需要的朋友可以參考下
 

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

類圖:

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

可以看出,在這個觀察者模式的實現里有下面這些角色:
抽象主題(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
欧美日本高清一区| 欧美做受高潮1| 狠狠久久五月精品中文字幕| 精品久久久在线观看| 中文字幕亚洲欧美日韩高清| 国产精品免费观看在线| 中文字幕国产亚洲| 国产精品人成电影| 欧美大全免费观看电视剧大泉洋| 欧美亚洲伦理www| 久热99视频在线观看| 亚洲一区二区三区成人在线视频精品| 久久国产精品影片| 亚洲一区二区三区乱码aⅴ蜜桃女| 欧美激情精品久久久久久免费印度| 久久91精品国产91久久跳| 国产精品黄视频| 丝袜一区二区三区| 久久久成人精品视频| 国产精品高潮呻吟久久av黑人| 亚洲天堂网站在线观看视频| 国产精品免费一区二区三区都可以| 欧美亚洲视频在线看网址| 亚洲黄色av女优在线观看| 亚洲国产成人精品女人久久久| 欧美午夜美女看片| 日韩电影中文字幕在线观看| 亚洲欧洲日产国产网站| 成人av色在线观看| 亚洲国产精品专区久久| 欧洲精品毛片网站| 成人性生交xxxxx网站| 中文字幕亚洲自拍| 成人淫片在线看| 日韩av中文字幕在线| 国产色综合天天综合网| 麻豆一区二区在线观看| 亚洲图片欧洲图片av| 亚洲午夜av电影| 成人黄色午夜影院| 国产精品吊钟奶在线| 中文字幕精品一区久久久久| 最近2019中文字幕在线高清| 97视频国产在线| 91亚洲精品久久久| 欧美专区第一页| 在线观看日韩视频| 欧美精品在线免费播放| 久久国产天堂福利天堂| 精品magnet| 精品国产区一区二区三区在线观看| 国产精品91在线| 久久久久久亚洲精品中文字幕| 亚洲无av在线中文字幕| 91精品在线一区| 久久成人国产精品| 国产精品视频播放| 成人a免费视频| 国产精品视频男人的天堂| 尤物九九久久国产精品的特点| 国产视频久久久| 九九热r在线视频精品| 久久91超碰青草是什么| 欧美日韩国产限制| 国产91精品高潮白浆喷水| 97视频免费看| 国产欧美一区二区三区久久| 精品国产鲁一鲁一区二区张丽| 深夜福利国产精品| 亚洲国产精品高清久久久| 97超碰国产精品女人人人爽| 亚洲免费一级电影| 久久国产精品99国产精| 色在人av网站天堂精品| 91国内产香蕉| 91九色视频在线| 欧美成人精品激情在线观看| 国产精品自拍网| 日本精品久久久久影院| 国产成人精品av| 在线视频欧美日韩精品| 亚洲第五色综合网| 亚洲天堂网在线观看| 国产成人小视频在线观看| 欧美精品少妇videofree| 成人免费看片视频| 中文字幕视频一区二区在线有码| 欧美激情极品视频| 欧美性高潮床叫视频| 亚洲欧美在线播放| 久热精品视频在线免费观看| 欧美日韩中文字幕在线视频| 日韩中文字幕免费视频| 亚洲香蕉在线观看| 精品国产乱码久久久久久婷婷| 久久久久一本一区二区青青蜜月| 亚洲精品美女久久| 日韩一中文字幕| 欧美一级片一区| 久久伊人91精品综合网站| 国产精品1234| 亚洲激情视频网站| 色狠狠久久aa北条麻妃| 亚洲专区中文字幕| 欧美人在线观看| 亚洲国产欧美日韩精品| 在线观看欧美视频| 久久久精品日本| 亚洲欧洲日产国产网站| 色999日韩欧美国产| 国产精品91久久久| 国产一区二区三区精品久久久| 欧美极品少妇xxxxⅹ裸体艺术| 国自在线精品视频| 欧美日韩美女在线观看| 日本久久久久久久久久久| 国内精品久久久久久久| 成人网在线免费观看| 国产性色av一区二区| 国产成人精品电影久久久| 国产精品电影网| 国产区精品在线观看| 中文字幕欧美精品在线| 亚洲综合国产精品| 亚洲精品午夜精品| 亚洲精品资源美女情侣酒店| 91久久久久久久久| 欧美风情在线观看| 国产精品av免费在线观看| 91精品视频专区| 在线免费观看羞羞视频一区二区| 欧美成人精品影院| 欧美视频13p| 欧美综合国产精品久久丁香| 色偷偷亚洲男人天堂| 色午夜这里只有精品| 亚洲综合国产精品| 国产欧美va欧美va香蕉在| 亚洲色图色老头| 一色桃子一区二区| 亚洲精品福利免费在线观看| 欧美日韩一区二区免费在线观看| 亚洲人成毛片在线播放| 亚洲国产精品一区二区久| 狠狠色狠狠色综合日日五| 久久国产精品首页| 中文字幕在线视频日韩| 国产成人亚洲综合91精品| 97涩涩爰在线观看亚洲| 欧美性极品xxxx做受| 热99精品里视频精品| 伊人久久大香线蕉av一区二区| 91免费福利视频| 亚洲一区av在线播放| 欧美激情视频播放| 国产999精品视频| 美乳少妇欧美精品| 久久久精品国产网站| 九色91av视频| 国产精品黄页免费高清在线观看| xxx成人少妇69| 久久久999国产| 亚洲精品小视频| 亚洲国产日韩欧美在线动漫|