設計模式 觀察者模式

2021-09-26 01:47:55 字數 3615 閱讀 9075

平台

位址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修飾的

protected

synchronized

void

setchanged()

這意味著:你除非繼承自observable,否則無法建立observable例項,並組合到你自己的物件中來,這個設計違反了多用組合,少用繼承的設計原則。

相較於我們自己實現的觀察者模式,可以結合泛型定義被通知的訊息體,還可以結合我們的通知介面inotify等方式來擴充套件,開發自由度更加高。但是無論是哪種方式,關鍵是熟悉觀察者模式後,善用即可,

《head first》讀書筆記

python 設計模式 觀察者 觀察者設計模式

在觀察者設計模式這種模式中,物件被表示為等待事件觸發的觀察者。一旦發生指定的事件,觀察者就會關注該主體。當事件發生時,主體告訴觀察者它已經發生。以下uml圖表示觀察者模式 如何實現觀察者模式?現在讓我們來看看如何實現觀察者模式。參考以下實現 import threading import time ...

設計模式 觀察者模式

觀察者模式定義了物件間一對多的依賴關係,乙個物件發生變化時,所有依賴它的物件都得到通知並被自動更新。本文主要闡述觀察者模式在分布式scada人機介面中的使用,利用這種模式使得人機介面顯示效率更高。發布者 郵局 觀察者 參與者 讀者 訂閱者 當郵局收到報社新雜誌的時候,即郵局狀態發生了改變,於是郵局把...

設計模式 觀察者模式

核心思想 註冊 通知 撤銷註冊 observer 將自己註冊到被觀察物件 subject 中,被觀察物件將觀察者存放在乙個容器 container 裡。被觀察物件發生了某種變化 如圖中的somechange 從容器中得到所有註冊過的觀察者,將變化通知觀察者。觀察者告訴被觀察者要撤銷觀察,被觀察者從容...