如何實(shí)現(xiàn)觀察者模式
來(lái)源:
未知 |
責(zé)任編輯:六月芳菲 |
發(fā)布時(shí)間: 2018-03-02 09:24 | 瀏覽量:
更多精彩unity教程:http://www.westwoodtownhomes.com/resource/
觀察者設(shè)計(jì)模式遵循面向?qū)ο缶幊痰囊粋€(gè)最重要的原則。 這個(gè)原則是:
努力實(shí)現(xiàn)交互對(duì)象之間的低耦合設(shè)計(jì)。
這意味著你的類應(yīng)該能夠相互交互,但彼此之間知道很少對(duì)方內(nèi)部細(xì)節(jié)。這本質(zhì)上意味著你的類應(yīng)該具有低耦合性。
一個(gè)好的類比,有助于了解觀察者設(shè)計(jì)模式是如何工作的,如報(bào)紙訂閱。
報(bào)紙和訂閱者彼此都有內(nèi)部知識(shí)信息,但他們能夠互動(dòng)。報(bào)紙用新聞更新訂閱用戶,訂閱用戶讀它們提供的新聞。
實(shí)現(xiàn)觀察者模式
我們將在C++中實(shí)現(xiàn)觀察者設(shè)計(jì)模式。我們將使用抽象類來(lái)實(shí)現(xiàn)接口的概念。
我們會(huì)創(chuàng)建兩個(gè)接口,其名稱為:Subject和Observer。Subject接口將包含注冊(cè),刪除和通知Observer對(duì)象的虛函數(shù)。
Observer接口將有一個(gè)使用來(lái)自Subject對(duì)象的信息更新的虛函數(shù)。
然后我們將創(chuàng)建兩個(gè)具體的類,實(shí)現(xiàn)每個(gè)接口的虛函數(shù)。
將實(shí)現(xiàn)Subject接口的類將充當(dāng)新聞?wù)?。它將注?cè)并通知其訂閱者最新消息。
實(shí)現(xiàn)Observer接口的類將充當(dāng)訂閱者。它將預(yù)訂自己的Subject接口并接收任何通知。
更多精彩unity教程:http://www.westwoodtownhomes.com/resource/
Subject接口的實(shí)現(xiàn)
Subject接口的實(shí)現(xiàn)非常簡(jiǎn)單。回想一下,在C ++中創(chuàng)建一個(gè)接口,你必須讓類成為一個(gè)抽象類,通過(guò)使用虛函數(shù)并將其初始化為0。
代碼1顯示了Subject接口的實(shí)現(xiàn)。
代碼1:Subject接口
Subject類中的三個(gè)方法都必須是虛函數(shù)。 一個(gè)具體的類將繼承這個(gè)類,并要求具體子類必須實(shí)現(xiàn)三個(gè)虛擬方法。
Observer接口的實(shí)現(xiàn)
Observer接口的實(shí)現(xiàn)遵循與Subject接口相同的邏輯。但是,此接口只需要一個(gè)虛函數(shù)。
代碼2顯示了Observer接口的實(shí)現(xiàn)。
一個(gè)具體的類也將繼承這個(gè)類,并且必須實(shí)現(xiàn)虛函數(shù)update方法。
代碼2: Observer 接口
NewsStation類實(shí)現(xiàn)
代碼3和4顯示了NewsStation類的實(shí)現(xiàn)。
具體類中包含一個(gè)向量來(lái)存儲(chǔ)Observer對(duì)象。
代碼3. NewsStation.h文件
當(dāng)NewsStation類需要通知其訂閱用戶時(shí),它只要通過(guò)遍歷向量并發(fā)送更新。
代碼4:Newspaper方法實(shí)現(xiàn)
實(shí)現(xiàn)NewsReader類
代碼5和6中顯示了NewsReader類的實(shí)現(xiàn)。
注意,我們有一個(gè)指向Subject接口的指針,如代碼5所示。
在創(chuàng)建NewsReader類之后,我們將對(duì)象注冊(cè)到Subject接口,在本例中是注冊(cè)到NewsStation類中。
代碼5:NewsReader.h文件
代碼6顯示了Update方法的實(shí)現(xiàn)。它只是輸出讀者已經(jīng)被通知的消息。
代碼6. NewsReader方法實(shí)現(xiàn)
[table][tr][td]
void
NewsReader::update(){
//Output:"I am the news reader that was notified"
cout
更多精彩unity教程:http://www.westwoodtownhomes.com/resource/
觀察者設(shè)計(jì)模式遵循面向?qū)ο缶幊痰囊粋€(gè)最重要的原則。 這個(gè)原則是:
努力實(shí)現(xiàn)交互對(duì)象之間的低耦合設(shè)計(jì)。
這意味著你的類應(yīng)該能夠相互交互,但彼此之間知道很少對(duì)方內(nèi)部細(xì)節(jié)。這本質(zhì)上意味著你的類應(yīng)該具有低耦合性。
一個(gè)好的類比,有助于了解觀察者設(shè)計(jì)模式是如何工作的,如報(bào)紙訂閱。
報(bào)紙和訂閱者彼此都有內(nèi)部知識(shí)信息,但他們能夠互動(dòng)。報(bào)紙用新聞更新訂閱用戶,訂閱用戶讀它們提供的新聞。
實(shí)現(xiàn)觀察者模式
我們將在C++中實(shí)現(xiàn)觀察者設(shè)計(jì)模式。我們將使用抽象類來(lái)實(shí)現(xiàn)接口的概念。
我們會(huì)創(chuàng)建兩個(gè)接口,其名稱為:Subject和Observer。Subject接口將包含注冊(cè),刪除和通知Observer對(duì)象的虛函數(shù)。
Observer接口將有一個(gè)使用來(lái)自Subject對(duì)象的信息更新的虛函數(shù)。
然后我們將創(chuàng)建兩個(gè)具體的類,實(shí)現(xiàn)每個(gè)接口的虛函數(shù)。
將實(shí)現(xiàn)Subject接口的類將充當(dāng)新聞?wù)?。它將注?cè)并通知其訂閱者最新消息。
實(shí)現(xiàn)Observer接口的類將充當(dāng)訂閱者。它將預(yù)訂自己的Subject接口并接收任何通知。
更多精彩unity教程:http://www.westwoodtownhomes.com/resource/
Subject接口的實(shí)現(xiàn)
Subject接口的實(shí)現(xiàn)非常簡(jiǎn)單。回想一下,在C ++中創(chuàng)建一個(gè)接口,你必須讓類成為一個(gè)抽象類,通過(guò)使用虛函數(shù)并將其初始化為0。
代碼1顯示了Subject接口的實(shí)現(xiàn)。
代碼1:Subject接口
#include "Observer.h" class Subject{ public : virtual void registerObserver(Observer *obs)=0; virtual void removeObserver(Observer *obs)=0; virtual void notifyObserver()=0; }; |
Observer接口的實(shí)現(xiàn)
Observer接口的實(shí)現(xiàn)遵循與Subject接口相同的邏輯。但是,此接口只需要一個(gè)虛函數(shù)。
代碼2顯示了Observer接口的實(shí)現(xiàn)。
一個(gè)具體的類也將繼承這個(gè)類,并且必須實(shí)現(xiàn)虛函數(shù)update方法。
代碼2: Observer 接口
class Observer{ public : virtual void update()=0; }; |
NewsStation類實(shí)現(xiàn)
代碼3和4顯示了NewsStation類的實(shí)現(xiàn)。
具體類中包含一個(gè)向量來(lái)存儲(chǔ)Observer對(duì)象。
代碼3. NewsStation.h文件
class NewsStation: public Subject{ public : //vector to store all register observers vector observers; //constructor NewsStation(){}; //method to register observer void registerObserver(Observer *obs); //method to remove observer void removeObserver(Observer *obs); //method to notify observer void notifyObserver(); }; |
代碼4:Newspaper方法實(shí)現(xiàn)
void NewsStation::registerObserver(Observer *obs){ observers.push_back(obs); } void NewsStation::removeObserver(Observer *obs){ observers.erase(find(observers.begin(), observers.end(), obs)); } void NewsStation::notifyObserver(){ //search for all register observers for ( int i=0; iupdate(); } } |
實(shí)現(xiàn)NewsReader類
代碼5和6中顯示了NewsReader類的實(shí)現(xiàn)。
注意,我們有一個(gè)指向Subject接口的指針,如代碼5所示。
在創(chuàng)建NewsReader類之后,我們將對(duì)象注冊(cè)到Subject接口,在本例中是注冊(cè)到NewsStation類中。
代碼5:NewsReader.h文件
#include "Subject.h" class NewsReader: public Observer{ public : Subject *subject; //Note that we are registering the newsreader to the Subject class during initialization NewsReader(Subject *sub){ subject=sub; subject->registerObserver( this ); } void update(); }; |
代碼6. NewsReader方法實(shí)現(xiàn)
[table][tr][td]
void
NewsReader::update(){
//Output:"I am the news reader that was notified"
cout
更多精彩unity教程:http://www.westwoodtownhomes.com/resource/
-
分享到:
相關(guān)文章
網(wǎng)友評(píng)論
您需要登錄后才可以發(fā)帖 登錄 | 立即注冊(cè)
關(guān)閉
- 用戶名:
- 密 碼:
- 驗(yàn)證碼:
看不清? 點(diǎn)擊更換
- 忘記密碼?
全部評(píng)論:0條
推薦
熱門