? 98精产国品一二三产区区,中国农材一级大片在线视频,688欧美人禽杂交狂配
聯(lián)系我們

給我們留言

聯(lián)系我們

地址:福建省晉江市青陽街道洪山路國(guó)際工業(yè)設(shè)計(jì)園納金網(wǎng)

郵箱:info@narkii.com

電話:0595-82682267

(周一到周五, 周六周日休息)

當(dāng)前位置:主頁 > 3D教程 > 圖文教程

如何實(shí)現(xiàn)觀察者模式

來源: 未知 | 責(zé)任編輯:六月芳菲 | 發(fā)布時(shí)間: 2018-03-02 09:24 | 瀏覽量:
更多精彩unity教程:http://trusteddivorcelawyers.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ì)模式。我們將使用抽象類來實(shí)現(xiàn)接口的概念。
我們會(huì)創(chuàng)建兩個(gè)接口,其名稱為:Subject和Observer。Subject接口將包含注冊(cè),刪除和通知Observer對(duì)象的虛函數(shù)。
Observer接口將有一個(gè)使用來自Subject對(duì)象的信息更新的虛函數(shù)。
然后我們將創(chuàng)建兩個(gè)具體的類,實(shí)現(xiàn)每個(gè)接口的虛函數(shù)。
將實(shí)現(xiàn)Subject接口的類將充當(dāng)新聞?wù)尽K鼘⒆?cè)并通知其訂閱者最新消息。
實(shí)現(xiàn)Observer接口的類將充當(dāng)訂閱者。它將預(yù)訂自己的Subject接口并接收任何通知。

更多精彩unity教程:http://trusteddivorcelawyers.com/resource/
 
Subject接口的實(shí)現(xiàn)
 
Subject接口的實(shí)現(xiàn)非常簡(jiǎn)單?;叵胍幌拢贑 ++中創(chuàng)建一個(gè)接口,你必須讓類成為一個(gè)抽象類,通過使用虛函數(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;
};
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 接口
 

class 
Observer{
public

virtual 
void 
update()=0;
};
 
NewsStation類實(shí)現(xiàn)
 
代碼3和4顯示了NewsStation類的實(shí)現(xiàn)。
具體類中包含一個(gè)向量來存儲(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();
};
當(dāng)NewsStation類需要通知其訂閱用戶時(shí),它只要通過遍歷向量并發(fā)送更新。
 
代碼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顯示了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://trusteddivorcelawyers.com/resource/
 

相關(guān)文章
網(wǎng)友評(píng)論

您需要登錄后才可以發(fā)帖 登錄 | 立即注冊(cè)

關(guān)閉

全部評(píng)論:0條

推薦
熱門