設計模式C 實現(15) 觀察者模式

2021-06-25 08:46:35 字數 2021 閱讀 2234

分類: 設計模式

2011-08-10 11:13

11265人閱讀收藏 

舉報設計模式

c++blog

string

class

iterator

軟體領域中的設計模式為開發人員提供了一種使用專家設計經驗的有效途徑。設計模式中運用了物件導向程式設計語言的重要特性:封裝、繼承、多型,真正領悟設計模式的精髓是可能乙個漫長的過程,需要大量實踐經驗的積累。最近看設計模式的書,對於每個模式,用c++寫了個小例子,加深一下理解。主要參考《大話設計模式》和《設計模式:可復用物件導向軟體的基礎》兩本書。本文介紹觀察者模式的實現。

觀察者模式:定義物件間的一種一對多的依賴關係,當乙個物件的狀態發生改變時,所有依賴於它的物件都得到通知並被自動更新。它還有兩個別名,依賴(dependents),發布-訂閱(publish-subsrcibe)。可以舉個部落格訂閱的例子,當博主發表新文章的時候,即博主狀態發生了改變,那些訂閱的讀者就會收到通知,然後進行相應的動作,比如去看文章,或者收藏起來。博主與讀者之間存在種一對多的依賴關係。下面給出相應的uml圖設計。

可以看到部落格類中有乙個觀察者鍊錶(即訂閱者),當部落格的狀態發生變化時,通過notify成員函式通知所有的觀察者,告訴他們部落格的狀態更新了。而觀察者通過update成員函式獲取部落格的狀態資訊。**實現不難,下面給出c++的一種實現。

[cpp]view plain

copy

print?

//觀察者

class

observer    

virtual

~observer() {}  

virtual

void

update() {}   

};  

//部落格

class

blog    

virtual

~blog() {}  

void

attach(observer *observer)      

//新增觀察者

void

remove(observer *observer)         

//移除觀察者

void

notify() 

//通知觀察者

virtual

void

setstatus(string s)  

//設定狀態

virtual

string getstatus()     

//獲得狀態

private

:  listm_observers; //觀察者鍊錶

protected

:  string m_status; //狀態

};  

以上是觀察者和部落格的基類,定義了通用介面。部落格類主要完成觀察者的新增、移除、通知操作,設定和獲得狀態僅僅是乙個預設實現。下面給出它們相應的子類實現。     

[cpp]view plain

copy

print?

//具體部落格類

class

blogcsdn : 

public

blog  

~blogcsdn() {}  

void

setstatus(string s)  

//具體設定狀態資訊

string getstatus()   

};  

//具體觀察者

class

observerblog : 

public

observer     

~observerblog() {}  

void

update()  

//獲得更新狀態

};  

客戶的使用方式:

[cpp]view plain

copy

print?

//測試案例

intmain()  

設計模式C 實現(15) 觀察者模式

軟體領域中的設計模式為開發人員提供了一種使用專家設計經驗的有效途徑。設計模式中運用了物件導向程式設計語言的重要特性 封裝 繼承 多型,真正領悟設計模式的精髓是可能乙個漫長的過程,需要大量實踐經驗的積累。最近看設計模式的書,對於每個模式,用c 寫了個小例子,加深一下理解。主要參考 大話設計模式 和 設...

設計模式C 實現(15) 觀察者模式

分類 設計模式 設計模式 c blog string class iterator 軟體領域中的設計模式為開發人員提供了一種使用專家設計經驗的有效途徑。設計模式中運用了物件導向程式設計語言的重要特性 封裝 繼承 多型,真正領悟設計模式的精髓是可能乙個漫長的過程,需要大量實踐經驗的積累。最近看設計模式...

設計模式C 實現(15) 觀察者模式

軟體領域中的設計模式為開發人員提供了一種使用專家設計經驗的有效途徑。設計模式中運用了物件導向程式設計語言的重要特性 封裝 繼承 多型,真正領悟設計模式的精髓是可能乙個漫長的過程,需要大量實踐經驗的積累。最近看設計模式的書,對於每個模式,用c 寫了個小例子,加深一下理解。主要參考 大話設計模式 和 設...