如何實現(xiàn)觀察者模式
來源:
未知 |
責任編輯:六月芳菲 |
發(fā)布時間: 2018-03-02 09:24 | 瀏覽量:
更多精彩unity教程:http://m.594ljc.cn/resource/
觀察者設(shè)計模式遵循面向?qū)ο缶幊痰囊粋€最重要的原則。 這個原則是:
努力實現(xiàn)交互對象之間的低耦合設(shè)計。
這意味著你的類應該能夠相互交互,但彼此之間知道很少對方內(nèi)部細節(jié)。這本質(zhì)上意味著你的類應該具有低耦合性。
一個好的類比,有助于了解觀察者設(shè)計模式是如何工作的,如報紙訂閱。
報紙和訂閱者彼此都有內(nèi)部知識信息,但他們能夠互動。報紙用新聞更新訂閱用戶,訂閱用戶讀它們提供的新聞。
實現(xiàn)觀察者模式
我們將在C++中實現(xiàn)觀察者設(shè)計模式。我們將使用抽象類來實現(xiàn)接口的概念。
我們會創(chuàng)建兩個接口,其名稱為:Subject和Observer。Subject接口將包含注冊,刪除和通知Observer對象的虛函數(shù)。
Observer接口將有一個使用來自Subject對象的信息更新的虛函數(shù)。
然后我們將創(chuàng)建兩個具體的類,實現(xiàn)每個接口的虛函數(shù)。
將實現(xiàn)Subject接口的類將充當新聞站。它將注冊并通知其訂閱者最新消息。
實現(xiàn)Observer接口的類將充當訂閱者。它將預訂自己的Subject接口并接收任何通知。
更多精彩unity教程:http://m.594ljc.cn/resource/
Subject接口的實現(xiàn)
Subject接口的實現(xiàn)非常簡單?;叵胍幌?,在C ++中創(chuàng)建一個接口,你必須讓類成為一個抽象類,通過使用虛函數(shù)并將其初始化為0。
代碼1顯示了Subject接口的實現(xiàn)。
代碼1:Subject接口
Subject類中的三個方法都必須是虛函數(shù)。 一個具體的類將繼承這個類,并要求具體子類必須實現(xiàn)三個虛擬方法。
Observer接口的實現(xiàn)
Observer接口的實現(xiàn)遵循與Subject接口相同的邏輯。但是,此接口只需要一個虛函數(shù)。
代碼2顯示了Observer接口的實現(xiàn)。
一個具體的類也將繼承這個類,并且必須實現(xiàn)虛函數(shù)update方法。
代碼2: Observer 接口
NewsStation類實現(xiàn)
代碼3和4顯示了NewsStation類的實現(xiàn)。
具體類中包含一個向量來存儲Observer對象。
代碼3. NewsStation.h文件
當NewsStation類需要通知其訂閱用戶時,它只要通過遍歷向量并發(fā)送更新。
代碼4:Newspaper方法實現(xiàn)
實現(xiàn)NewsReader類
代碼5和6中顯示了NewsReader類的實現(xiàn)。
注意,我們有一個指向Subject接口的指針,如代碼5所示。
在創(chuàng)建NewsReader類之后,我們將對象注冊到Subject接口,在本例中是注冊到NewsStation類中。
代碼5:NewsReader.h文件
代碼6顯示了Update方法的實現(xiàn)。它只是輸出讀者已經(jīng)被通知的消息。
代碼6. NewsReader方法實現(xiàn)
[table][tr][td]
void
NewsReader::update(){
//Output:"I am the news reader that was notified"
cout
更多精彩unity教程:http://m.594ljc.cn/resource/
觀察者設(shè)計模式遵循面向?qū)ο缶幊痰囊粋€最重要的原則。 這個原則是:
努力實現(xiàn)交互對象之間的低耦合設(shè)計。
這意味著你的類應該能夠相互交互,但彼此之間知道很少對方內(nèi)部細節(jié)。這本質(zhì)上意味著你的類應該具有低耦合性。
一個好的類比,有助于了解觀察者設(shè)計模式是如何工作的,如報紙訂閱。
報紙和訂閱者彼此都有內(nèi)部知識信息,但他們能夠互動。報紙用新聞更新訂閱用戶,訂閱用戶讀它們提供的新聞。
實現(xiàn)觀察者模式
我們將在C++中實現(xiàn)觀察者設(shè)計模式。我們將使用抽象類來實現(xiàn)接口的概念。
我們會創(chuàng)建兩個接口,其名稱為:Subject和Observer。Subject接口將包含注冊,刪除和通知Observer對象的虛函數(shù)。
Observer接口將有一個使用來自Subject對象的信息更新的虛函數(shù)。
然后我們將創(chuàng)建兩個具體的類,實現(xiàn)每個接口的虛函數(shù)。
將實現(xiàn)Subject接口的類將充當新聞站。它將注冊并通知其訂閱者最新消息。
實現(xiàn)Observer接口的類將充當訂閱者。它將預訂自己的Subject接口并接收任何通知。
更多精彩unity教程:http://m.594ljc.cn/resource/
Subject接口的實現(xiàn)
Subject接口的實現(xiàn)非常簡單?;叵胍幌?,在C ++中創(chuàng)建一個接口,你必須讓類成為一個抽象類,通過使用虛函數(shù)并將其初始化為0。
代碼1顯示了Subject接口的實現(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接口的實現(xiàn)
Observer接口的實現(xiàn)遵循與Subject接口相同的邏輯。但是,此接口只需要一個虛函數(shù)。
代碼2顯示了Observer接口的實現(xiàn)。
一個具體的類也將繼承這個類,并且必須實現(xiàn)虛函數(shù)update方法。
代碼2: Observer 接口
class Observer{ public : virtual void update()=0; }; |
NewsStation類實現(xiàn)
代碼3和4顯示了NewsStation類的實現(xiàn)。
具體類中包含一個向量來存儲Observer對象。
代碼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方法實現(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(); } } |
實現(xiàn)NewsReader類
代碼5和6中顯示了NewsReader類的實現(xiàn)。
注意,我們有一個指向Subject接口的指針,如代碼5所示。
在創(chuàng)建NewsReader類之后,我們將對象注冊到Subject接口,在本例中是注冊到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方法實現(xiàn)
[table][tr][td]
void
NewsReader::update(){
//Output:"I am the news reader that was notified"
cout
更多精彩unity教程:http://m.594ljc.cn/resource/
-
分享到:
相關(guān)文章
網(wǎng)友評論
全部評論:0條
推薦
熱門