觀察者模式,是我們在開發過程中經常會遇到或者使用的設計模式。
比較常見的,我們在gui庫里便能看到其身影,譬如:鍵盤敲擊事件後,需要將這一事件通知到所有觀測鍵盤事件的物件。但凡涉及到這種一對多的通知,基本上都是觀察者模式的應用。
更詳細的介紹請參考:
我們經常使用的開發庫中經常會存在這種模式,但是實現方式卻不盡相同。所以,了解c/c++語言下觀察者模式的實現方式,對於我們學習和掌握各種開源庫將非常有幫助。一旦了解到該模式的存在,對整個**會更增加一層了解和信心。
下面,我以我所知道的幾種方式來分別實現乙個非常簡單的觀察者模式,以示語言特性和該模式的一些特徵。
假設,subject會接受整數a和b,同時該subject繫結了若干個observer,在接受到整數a和b之後,需要及時通知所有observer(例子裡作為觀察者的adder和muler皆簡單輸出a和b的和以及乘積)
先看c風格的**實現:
#include // c style
int add(int ia, int ib)
int mul(int ia, int ib)
typedef int (*fpcallback)(int ia, int ib);
int main()
; fpcb[0](1, 2);
fpcb[1](1, 2);
return 0;}
這種方式間接明了,一路了然。c的風格就是這樣的,不同的人寫一小段**,可能都大同小異。
#include #include // cpp style1
struct iobserver1
;struct subject1
void notify(int ia, int ib) }
std::vectorm_vecobserver;
};struct adder1 : public iobserver1
};struct muler1 : public iobserver1
};int main()
這個也是比較顯而易見的方式,定義乙個虛基類,各個觀察者必須繼承並實現該介面,以方便管理並及時收到通知。這種方式的可讀性比較好,但是耦合性比較大。
再看乙個c++實現的方式:
#include #include // cpp style2
struct iobserver2
;typedef int (iobserver2::*ofp)(int ia, int ib);
struct subject2
void notify(int ia, int ib) }
std::vectorm_vecpobj;
std::vectorm_vecofp;
};struct adder2 : public iobserver2
};struct muler2 : public iobserver2
};int main()
這個方法是基於類的成員函式指標來實現的,同樣是繼承,但是並不要求observer類必須實現制定的虛函式,只需要保證有相同的成員函式簽名。乙個observer類甚至能容納多個observer方法。這種方式相對前一種方式更靈活一點,但是同樣要求繼承乙個基類,還是有一定的耦合性。
再看最後乙個,c++11的版本
// cpp11
typedef std::functionintopfun;
struct subject3
void notify(int ia, int ib) }
std::vectorm_vecof;
};struct adder3
};struct muler3
};int main()
這種方式不需要繼承基類,不需要實現指定介面,通過std:fuction和std::bind可以發揮出相當大的自由度。但是在**易讀性上有一定損失。 觀察者模式實現
公升級觀察者 var observer function 定義介面 return else trigger方法用於觸發觀察者物件中的事件 type 要觸發的事件名稱 trigger用於觸發觀察者物件中的事件 trigger function type,val off方法用於移除某個事件 off fu...
java觀察者模式的實現
在看部落格裡,有個訂閱功能,當你訂閱後,當博主發布新的部落格,你都能收到訊息。這是如何實現的?是不是後台有個執行緒在不停的輪詢?如果是這樣的話,顯然太耗資源,如果當部落格在發布時,找到所有的訂閱者,然後迴圈的把訊息發給訂閱者,這樣就會顯得更人性化了。這就是觀察者模式,觀察者模式有兩個物件 博主,訂閱...
PHP實現觀察者模式
特點 觀察者模式定義物件的一對多依賴,這樣一來,當乙個物件改變狀態時,它的所有依賴者都會收到通知並自動更新 觀察者模式利用 組合 將許多觀察者組合進主題中。物件 觀察者 主題 之間的這種關係不是通過繼承產生的,而是在執行時利用組合的方式產生的。多用組合,少用繼承!觀察者模式的優點和缺點 觀察者模式的...