觀察著模式

2021-08-07 06:19:11 字數 1887 閱讀 7651

軟體領域中的設計模式為開發人員提供了一種使用專家設計經驗的有效途徑。設計模式中運用了物件導向程式設計語言的重要特性:封裝、繼承、多型,真正領悟設計模式的精髓是可能乙個漫長的過程,需要大量實踐經驗的積累。最近看設計模式的書,對於每個模式,用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()  

觀察著模式

觀察著模式 定義 物件間一種一對多的依賴關係,使得每當乙個物件改變狀態,則所有依賴於它的物件都會得到通知並自動 更新。思想 將實際擴充套件操作,降低到子類 應用 登入成功後,傳送郵件 寫入日誌 主體介面 inte ce observable 主體 class login implements obs...

裝飾著模式

package com.henu.decorator 漢堡基類 author rock public abstract class humburger public abstract double getprice package com.henu.decorator 雞腿堡類 被裝飾者的初始狀態,...

裝飾著模式

裝飾著模式 裝飾者模式動態地將責任附加到物件上。若要擴充套件功能,裝飾者提供了比繼承更有彈性的替代方案。案例 有這樣乙個專案,做乙個餐廳訂餐系統。起初的 結構是這樣的。前面有很多beverage的繼承類,現在遇到的問題是牛奶的價錢 了,那麼所有相關的類,我們都要進行調整,比如milk,sugaran...