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

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

C++設計模式之觀察者模式

2020-01-26 15:15:53
字體:
來源:轉載
供稿:網友

前言

之前做了一個性能測試的項目,就是需要對現在的產品進行性能測試,獲得測試數據,然后書寫測試報告,并提出合理化的改善意見。項目很簡單,我們獲得了一系列性能測試數據,對于數據,我們需要在Excel中制作測試數據的折線圖、餅狀圖和柱狀圖,以直觀的表現出性能的變化。在實際操作時,我發現,如果我修改了一個數據,折線圖、餅狀圖和柱狀圖就都發生了變換。這個是如何做到的?這就要說到今天總結的觀察者模式了,作為設計模式大家庭中最重要的一個,我們不得不去好好的學習一下觀察者模式。

觀察者模式

在GOF的《設計模式:可復用面向對象軟件的基礎》一書中對觀察者模式是這樣說的:定義對象間的一種一對多的依賴關系,當一個對象的狀態發生改變時,所有依賴于它的對象都得到通知并被自動更新。當一個對象發生了變化,關注它的對象就會得到通知;這種交互也稱為發布-訂閱(publish-subscribe)。目標是通知的發布者,它發出通知時并不需要知道誰是它的觀察者。

再說說上面的數據和圖之間的關系;不管是折線圖、餅狀圖,還是柱狀圖,它們都依賴于數據;當數據發生變化時,數據對象會通知依賴于它的對象去更新;所以就有了Excel中,當數據發生變化時,對應的統計圖也會自動的重繪。

UML類圖

Subject(目標)
――目標知道它的觀察者。可以有任意多個觀察者觀察同一個目標;
――提供注冊和刪除觀察者對象的接口。

Observer(觀察者)
――為那些在目標發生改變時需獲得通知的對象定義一個更新接口。

ConcreteSubject(具體目標)
――將有關狀態存入各ConcreteObserver對象;
――當它的狀態發生改變時,向它的各個觀察者發出通知。

ConcreteObserver(具體觀察者)
――維護一個指向ConcreteSubject對象的引用;
――存儲有關狀態,這些狀態應與目標的狀態保持一致;
――實現Observer的更新接口以使自身狀態與目標的狀態保持一致。

觀察者模式按照以下方式進行協作:

1.當ConcreteSubject發生任何可能導致其觀察者與其本身狀態不一致的改變時,它將通知它的各個觀察者;

2.在得到一個具體目標的改變通知后,ConcreteObserver對象可向目標對象查詢信息。ConcreteObserver使用這些信息以使它的狀態與目標對象的狀態一致。

以下是調用時序圖:

使用場合

在以下任一情況下都可以使用觀察者模式:

1.當一個抽象模型有兩個方面,其中一個方面依賴于另一方面。將這二者封裝在獨立的對象中以使它們可以各自獨立的改變和復用;
2.當對一個對象的改變需要同時改變其它對象,而不知道具體有多少對象有待改變;
3.當一個對象必須通知其它對象,而它又不能假定其它對象是誰;也就是說,你不希望這些對象是緊密耦合的。

代碼實現

復制代碼 代碼如下:

#include <iostream>
#include <list>
using namespace std;
 
class Observer
{
public:
     virtual void Update(int) = 0;
};
 
class Subject
{
public:
     virtual void Attach(Observer *) = 0;
     virtual void Detach(Observer *) = 0;
     virtual void Notify() = 0;
};
 
class ConcreteObserver : public Observer
{
public:
     ConcreteObserver(Subject *pSubject) : m_pSubject(pSubject){}
 
     void Update(int value)
     {
          cout<<"ConcreteObserver get the update. New State:"<<value<<endl;
     }
 
private:
     Subject *m_pSubject;
};
 
class ConcreteObserver2 : public Observer
{
public:
     ConcreteObserver2(Subject *pSubject) : m_pSubject(pSubject){}
 
     void Update(int value)
     {
          cout<<"ConcreteObserver2 get the update. New State:"<<value<<endl;
     }
 
private:
     Subject *m_pSubject;
};
 
class ConcreteSubject : public Subject
{
public:
     void Attach(Observer *pObserver);
     void Detach(Observer *pObserver);
     void Notify();
 
     void SetState(int state)
     {
          m_iState = state;
     }
 
private:
     std::list<Observer *> m_ObserverList;
     int m_iState;
};
 
void ConcreteSubject::Attach(Observer *pObserver)
{
     m_ObserverList.push_back(pObserver);
}
 
void ConcreteSubject::Detach(Observer *pObserver)
{
     m_ObserverList.remove(pObserver);
}
 
void ConcreteSubject::Notify()
{
     std::list<Observer *>::iterator it = m_ObserverList.begin();
     while (it != m_ObserverList.end())
     {
          (*it)->Update(m_iState);
          ++it;
     }
}
 
int main()
{
     // Create Subject
     ConcreteSubject *pSubject = new ConcreteSubject();
 
     // Create Observer
     Observer *pObserver = new ConcreteObserver(pSubject);
     Observer *pObserver2 = new ConcreteObserver2(pSubject);
 
     // Change the state
     pSubject->SetState(2);
 
     // Register the observer
     pSubject->Attach(pObserver);
     pSubject->Attach(pObserver2);
 
     pSubject->Notify();
 
     // Unregister the observer
     pSubject->Detach(pObserver);
 
     pSubject->SetState(3);
     pSubject->Notify();
 
     delete pObserver;
     delete pObserver2;
     delete pSubject;
}

總結

觀察者模式在23個設計模式中的地位是非常高的,我們基本上各大框架中都是隨處可見。真正的理解了整個模式,對我們去理解別人的代碼有非常大的幫助;在我們日后的工作中也會或多或少的使用該設計模式。這里總結的不是很全面,在日后如果碰到了需要補充的內容,我會繼續補充的;同時也希望大家提出更好的建議。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩视频第一页| 色妞色视频一区二区三区四区| 91免费在线视频网站| 久久亚洲综合国产精品99麻豆精品福利| 久久久久国产精品免费网站| 久久久久久久久久国产精品| 米奇精品一区二区三区在线观看| 欧美性xxxx极品hd欧美风情| 黄色成人av在线| 欧美影院在线播放| 57pao国产成人免费| 亚洲人成电影在线观看天堂色| 久久久免费观看视频| 亚洲成色777777在线观看影院| 亚洲第一区在线| yellow中文字幕久久| 欧美三级免费观看| 国产精品偷伦一区二区| 国产精品wwwwww| 亚洲精品自在久久| 国产精品第二页| 不卡av在线网站| 北条麻妃在线一区二区| 亚洲iv一区二区三区| 伊人久久久久久久久久久久久| 亚洲性日韩精品一区二区| 欧美午夜丰满在线18影院| 欧美日韩国产成人在线| 久久影院中文字幕| 深夜福利日韩在线看| 日韩在线视频中文字幕| 成人a在线观看| 国产a∨精品一区二区三区不卡| 91成人免费观看网站| 午夜精品三级视频福利| 国产福利成人在线| 日韩电影免费在线观看中文字幕| 日韩av在线影院| 亚洲黄色av女优在线观看| 欧美午夜美女看片| 成人福利视频网| 亚洲精品免费一区二区三区| 久久久久久久国产| 亚洲黄页视频免费观看| 久久久久久久久电影| 欧美亚洲国产日本| 亚洲免费视频在线观看| 成人久久一区二区三区| 欧美激情中文网| 爱福利视频一区| 在线播放日韩欧美| 国产精品一久久香蕉国产线看观看| 欧洲午夜精品久久久| 欧美日韩免费网站| 成人免费网站在线观看| 中文字幕一区二区精品| 97香蕉超级碰碰久久免费软件| 91亚洲精品久久久久久久久久久久| 97国产一区二区精品久久呦| 国产999在线观看| 精品国产91乱高清在线观看| 疯狂欧美牲乱大交777| 亚洲天堂男人的天堂| 国产精品一香蕉国产线看观看| 亚洲精品成人久久电影| 亚洲色图25p| 日韩欧美国产成人| 欧美做受高潮电影o| 亚洲成人网在线| 69久久夜色精品国产69乱青草| 国产精品成人一区二区| 国产精品99免视看9| 欧美在线视频网| 久久久精品日本| 日韩av片永久免费网站| 国产精品欧美在线| 欲色天天网综合久久| 亚洲成人动漫在线播放| 国产精品羞羞答答| 国产精品中文字幕在线观看| 国产精品91在线观看| 欧美成年人在线观看| 欧美大片欧美激情性色a∨久久| 亚洲国产精品电影| 欧美激情视频在线观看| 欲色天天网综合久久| 久久久精品一区二区| 国产欧美日韩专区发布| 久久69精品久久久久久久电影好| 亚洲成在人线av| 欧美日韩亚洲一区二区三区| 色无极影院亚洲| 一区二区国产精品视频| 成人女保姆的销魂服务| 国产精品91一区| 久久精品国产成人| 岛国av一区二区| 亚洲mm色国产网站| 国内免费久久久久久久久久久| 国内偷自视频区视频综合| www.欧美视频| 奇米成人av国产一区二区三区| 亚洲国产私拍精品国模在线观看| 精品久久久91| 国产精品视频精品视频| 国产国产精品人在线视| 久久精品成人欧美大片古装| 国产精品视频久久| 国产精品h在线观看| 日韩在线免费观看视频| 久久久久久久久爱| 97色在线视频| 88xx成人精品| 亚洲欧美中文日韩在线v日本| 亚洲男人天堂2023| 欧美亚洲视频在线观看| 91精品国产99久久久久久| 91情侣偷在线精品国产| 国产午夜精品免费一区二区三区| 中文字幕日韩专区| 亚洲成av人片在线观看香蕉| 精品精品国产国产自在线| 97高清免费视频| 欧洲午夜精品久久久| y97精品国产97久久久久久| 亚洲影院色在线观看免费| 欧美激情a∨在线视频播放| 在线精品国产欧美| 日本欧美中文字幕| 中文字幕在线看视频国产欧美在线看完整| 日韩高清电影免费观看完整版| 亚洲午夜av电影| 日本一区二区在线播放| 日韩专区中文字幕| 成人黄色生活片| 2019国产精品自在线拍国产不卡| 亚洲激情视频在线| 精品国内自产拍在线观看| 国产精品成人观看视频国产奇米| 欧美在线视频网站| 欧美另类老女人| 日韩欧美综合在线视频| 亚洲精品日韩激情在线电影| 欧洲亚洲在线视频| 超在线视频97| 欧美日韩高清在线观看| 高清欧美性猛交xxxx黑人猛交| 91视频国产精品| 91嫩草在线视频| 亚洲精品在线观看www| 亚洲精品国产福利| 久久久久女教师免费一区| 久久99热精品这里久久精品| 在线观看日韩专区| 草民午夜欧美限制a级福利片| 久久99国产综合精品女同| 国产欧美精品日韩| 91久久精品国产91久久性色| 国产精品第一视频| 国产v综合ⅴ日韩v欧美大片| 精品自拍视频在线观看| 日韩精品www| 国产男人精品视频| 国产成人亚洲综合91精品|