平台
位址csdn
個人部落格
觀察者模式定義了物件之間的一對多依賴,這樣依賴,當乙個物件改變狀態時,它的所有依賴者都會收到通知並更新。對於觀察模式的實現方式有很多種,一般是以包含subject和observer介面的類設計做法最為常見。
根據多個觀察者對於同一主題資訊的獲取方式,可以分為:
被觀察者(主題)主動推送,一變化,就將被觀察物件推送給所有觀察者。
觀察者通過介面主動拉取主題中的部分資訊,避免無關資訊的干擾。
觀察者模式的好處:
加入我們現在有個手機工廠,每次生產出一批手機後,就需要通知對應的**商過來拿貨。
我們就可以利用觀察者模式來實現這個場景需求。
類圖
手機工廠
public
class
phonefactory
implements
subject
/*** 註冊觀察者
** @param observer
*/@override
public
void
register
(observer
observer)
/** * 登出觀察者
** @param observer
*/@override
public
void
cancel
(observer
observer)
/** * 傳送通知
*/@override
public
void
sendmessage()
);}/**
* 外部設定訊息變更
* @param message
*/public
void
setmessage
(message message)
}
訊息體
@data
@builder
@allargsconstructor
public
class
message
**商
//**
public
class
taobaoagent
implements
observer
}//天貓
public
class
tianmaoagent
implements
observer
}
/**
* 自定義觀察者模式
*/@test
public
void
testx1()
列印
從輸出可以看出,觀察者和被觀察者有以下幾個特點:tianmao receive message: 剛生產了100臺xiaomi手機
taobao receive message: 剛生產了100臺xiaomi手機
-------------------
taobao receive message: 剛又生產了100臺iphone
那麼思考下這個模式有沒有什麼不好的地方?
帶著問題,我們來看下jdk內建的觀察者模式怎麼實現的?並看下如何實現主動拉取被觀察者資訊。
jdk內建觀察者模式實現比較下變化:public
class
phonefactory2
extends
observable
/** * 觀察者按需主動拉取自己所需要資訊
* @return
*/public message getmessage()
}public
class
taobaoagent2
implements
observer
}public
class
tianmaoagent2
implements
observer
}
定義下測試類:
看下測試類的輸出:/**
* 使用jdk原生觀察者模式
*/@test
public
void
testx2()
分析下兩次輸出的區別:taobao2 receive message: message(data=剛生產了100臺xiaomi手機)
tianmao2 receive message: message(data=剛生產了100臺xiaomi手機)
-------------------
taobao2 receive message: message(data=剛又生產了100臺iphone)
pull message:message(data=剛又生產了100臺iphone)
其實乍看之下,兩種方式實現結果貌似沒什麼區別,但是仔細觀察jdk內建的observable,不是乙個介面,是個類。其內部的setchanged方法也是被
protected
修飾的這意味著:你除非繼承自observable,否則無法建立observable例項,並組合到你自己的物件中來,這個設計違反了protected
synchronized
void
setchanged()
多用組合,少用繼承
的設計原則。相較於我們自己實現的觀察者模式,可以結合泛型定義被通知的訊息體,還可以結合我們的通知介面
inotify
等方式來擴充套件,開發自由度更加高。但是無論是哪種方式,關鍵是熟悉觀察者模式後,善用即可,《head first》讀書筆記python 設計模式 觀察者 觀察者設計模式
在觀察者設計模式這種模式中,物件被表示為等待事件觸發的觀察者。一旦發生指定的事件,觀察者就會關注該主體。當事件發生時,主體告訴觀察者它已經發生。以下uml圖表示觀察者模式 如何實現觀察者模式?現在讓我們來看看如何實現觀察者模式。參考以下實現 import threading import time ...
設計模式 觀察者模式
觀察者模式定義了物件間一對多的依賴關係,乙個物件發生變化時,所有依賴它的物件都得到通知並被自動更新。本文主要闡述觀察者模式在分布式scada人機介面中的使用,利用這種模式使得人機介面顯示效率更高。發布者 郵局 觀察者 參與者 讀者 訂閱者 當郵局收到報社新雜誌的時候,即郵局狀態發生了改變,於是郵局把...
設計模式 觀察者模式
核心思想 註冊 通知 撤銷註冊 observer 將自己註冊到被觀察物件 subject 中,被觀察物件將觀察者存放在乙個容器 container 裡。被觀察物件發生了某種變化 如圖中的somechange 從容器中得到所有註冊過的觀察者,將變化通知觀察者。觀察者告訴被觀察者要撤銷觀察,被觀察者從容...