设计模式C++实现--Observer模式
2019獨角獸企業重金招聘Python工程師標準>>>
觀察者模式
當對象間存在一對多關系時,則使用觀察者模式(Observer Pattern)。比如,當一個對象被修改時,則會自動通知它的依賴對象。觀察者模式屬于行為型模式。
介紹
意圖:定義對象間的一種一對多的依賴關系,當一個對象的狀態發生改變時,所有依賴于它的對象都得到通知并被自動更新。
主要解決:一個對象狀態改變給其他對象通知的問題,而且要考慮到易用和低耦合,保證高度的協作。
何時使用:一個對象(目標對象)的狀態發生改變,所有的依賴對象(觀察者對象)都將得到通知,進行廣播通知。
如何解決:使用面向對象技術,可以將這種依賴關系弱化。
關鍵代碼:在抽象類里有一個 ArrayList 存放觀察者們。
應用實例:?1、拍賣的時候,拍賣師觀察最高標價,然后通知給其他競價者競價。 2、西游記里面悟空請求菩薩降服紅孩兒,菩薩灑了一地水招來一個老烏龜,這個烏龜就是觀察者,他觀察菩薩灑水這個動作。
優點:?1、觀察者和被觀察者是抽象耦合的。 2、建立一套觸發機制。
缺點:?1、如果一個被觀察者對象有很多的直接和間接的觀察者的話,將所有的觀察者都通知到會花費很多時間。 2、如果在觀察者和觀察目標之間有循環依賴的話,觀察目標會觸發它們之間進行循環調用,可能導致系統崩潰。 3、觀察者模式沒有相應的機制讓觀察者知道所觀察的目標對象是怎么發生變化的,而僅僅只是知道觀察目標發生了變化。
使用場景:
- 一個抽象模型有兩個方面,其中一個方面依賴于另一個方面。將這些方面封裝在獨立的對象中使它們可以各自獨立地改變和復用。
- 一個對象的改變將導致其他一個或多個對象也發生改變,而不知道具體有多少對象將發生改變,可以降低對象之間的耦合度。
- 一個對象必須通知其他對象,而并不知道這些對象是誰。
- 需要在系統中創建一個觸發鏈,A對象的行為將影響B對象,B對象的行為將影響C對象……,可以使用觀察者模式創建一種鏈式觸發機制。
注意事項:?1、JAVA 中已經有了對觀察者模式的支持類。 2、避免循環引用。 3、如果順序執行,某一觀察者錯誤會導致系統卡殼,一般采用異步方式。
實現
觀察者模式使用三個類 Subject、Observer 和 Client。Subject 對象帶有綁定觀察者到 Client 對象和從 Client 對象解綁觀察者的方法。我們創建?Subject?類、Observer?抽象類和擴展了抽象類?Observer?的實體類。
ObserverPatternDemo,我們的演示類使用?Subject?和實體類對象來演示觀察者模式。
? ? ? ? ??
步驟 1
創建 Subject 類。
// 被觀察者 class Subject{ private:list<Observer *> _observers;int _state;public:int GetState(){return _state;}void SetState(int state){_state = state;NotifyAllObservers();}void Attach(Observer * observer){_observers.push_back(observer);}void NotifyAllObservers(){list<Observer*>::iterator iter = _observers.begin();for(;iter != _observers.end();iter++){(*iter)->update();}} };步驟 2
創建 Observer 類。
class Subject;class Observer{ protected:Subject * _subject;public:Observer(Subject *subject) : _subject(subject) {}virtual ~Observer(){}virtual void update() = 0; };步驟 3
創建實體觀察者類。
class BinaryObserver : public Observer{ public:BinaryObserver(Subject *subject) : Observer(subject) {_subject->Attach(this);}void update() override {std::cout << "Binary string :" << _subject->GetState() << std::endl;} };class OctalObserver : public Observer{ public:OctalObserver(Subject *subject) : Observer(subject) {_subject->Attach(this);}void update() override {std::cout << "Octal String:" << _subject->GetState() << std::endl;} };class HexaObserver : public Observer{ public:HexaObserver(Subject *subject) : Observer(subject) {_subject->Attach(this);}void update() override {std::cout << "Hex String:" << _subject->GetState() << std::endl;} };步驟 4
使用?Subject?和實體觀察者對象。
Subject * subject = new Subject();Observer * o1 = new BinaryObserver(subject);Observer * o2 = new OctalObserver(subject);Observer * o3 = new HexaObserver(subject);subject->SetState(1);subject->SetState(3);步驟 5
驗證輸出。
Binary string :1 Octal String:1 Hex String:1 Binary string :3 Octal String:3 Hex String:3?
?
?
轉載于:https://my.oschina.net/fileoptions/blog/1823508
總結
以上是生活随笔為你收集整理的设计模式C++实现--Observer模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 中兴智能视觉大数据:人脸识别技术目前处于
- 下一篇: 数据挖掘 pandas基础入门之操作