從觀察者模式的實現,看c c 的語言特性

2021-06-23 09:45:35 字數 2057 閱讀 8194

觀察者模式,是我們在開發過程中經常會遇到或者使用的設計模式。

比較常見的,我們在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實現觀察者模式

特點 觀察者模式定義物件的一對多依賴,這樣一來,當乙個物件改變狀態時,它的所有依賴者都會收到通知並自動更新 觀察者模式利用 組合 將許多觀察者組合進主題中。物件 觀察者 主題 之間的這種關係不是通過繼承產生的,而是在執行時利用組合的方式產生的。多用組合,少用繼承!觀察者模式的優點和缺點 觀察者模式的...