javascript
java观察者模式在spring中的应用_在Spring中使用观察者模式
菜鳥(niǎo)教程中關(guān)于觀察者模式的介紹如下:
意圖:定義對(duì)象間的一種一對(duì)多的依賴(lài)關(guān)系,當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生改變時(shí),所有依賴(lài)于它的對(duì)象都得到通知并被自動(dòng)更新。
主要解決:一個(gè)對(duì)象狀態(tài)改變給其他對(duì)象通知的問(wèn)題,而且要考慮到易用和低耦合,保證高度的協(xié)作。
何時(shí)使用:一個(gè)對(duì)象(目標(biāo)對(duì)象)的狀態(tài)發(fā)生改變,所有的依賴(lài)對(duì)象(觀察者對(duì)象)都將得到通知,進(jìn)行廣播通知。
如何解決:使用面向?qū)ο蠹夹g(shù),可以將這種依賴(lài)關(guān)系弱化。
關(guān)鍵代碼:在抽象類(lèi)里有一個(gè) ArrayList 存放觀察者們。
應(yīng)用實(shí)例:?拍賣(mài)的時(shí)候,拍賣(mài)師觀察最高標(biāo)價(jià),然后通知給其他競(jìng)價(jià)者競(jìng)價(jià)。
優(yōu)點(diǎn):?1、觀察者和被觀察者是抽象耦合的。 2、建立一套觸發(fā)機(jī)制。
缺點(diǎn):?1、如果一個(gè)被觀察者對(duì)象有很多的直接和間接的觀察者的話,將所有的觀察者都通知到會(huì)花費(fèi)很多時(shí)間。 2、如果在觀察者和觀察目標(biāo)之間有循環(huán)依賴(lài)的話,觀察目標(biāo)會(huì)觸發(fā)它們之間進(jìn)行循環(huán)調(diào)用,可能導(dǎo)致系統(tǒng)崩潰。 3、觀察者模式?jīng)]有相應(yīng)的機(jī)制讓觀察者知道所觀察的目標(biāo)對(duì)象是怎么發(fā)生變化的,而僅僅只是知道觀察目標(biāo)發(fā)生了變化。
以下演示如何在實(shí)際的Spring工程中使用觀察者模式。
這個(gè)demo的框架如下所示,與直接實(shí)現(xiàn)的觀察者、被觀察者模式相比,可以通過(guò)中間的觀察者訂閱管理服務(wù)Bean,動(dòng)態(tài)注冊(cè)、移除觀察者,被觀察者狀態(tài)發(fā)生變化時(shí),會(huì)通知觀察者訂閱管理服務(wù),這個(gè)服務(wù)再通知所有訂閱了這個(gè)被觀察者的服務(wù)。
被觀察者需要繼承Java自帶的util包中的Observerble接口,并且調(diào)用setChange()和notifyObservers()函數(shù)通知被觀察者(在這里是觀察者訂閱管理服務(wù));觀察者服務(wù),需要實(shí)現(xiàn)Java Util包中的Observer類(lèi)接口。
首先被觀察者,在需要通知觀察者的時(shí)候,需要調(diào)用setChange()和notifyObservers()函數(shù)通知被觀察者,其中notifyObservers函數(shù)可以傳參數(shù)。
init函數(shù)在Bean初始化后,將觀察者訂閱管理服務(wù)添加到觀察者中。
然后是觀察者訂閱管理服務(wù),提供觀察者注冊(cè)、移除功能,在觀察者狀態(tài)變化時(shí),通知所有訂閱了的觀察者。
然后是觀察者,我在觀察者Bean創(chuàng)建成功后就在觀察者訂閱管理服務(wù)注冊(cè)了,也可以在其他有需要的時(shí)候拿到這個(gè)bean,訂閱或者移除。觀察者可以拿到被觀察者在notifyObservers函數(shù)傳過(guò)來(lái)的參數(shù)。
重要的事情
被觀察者狀態(tài)發(fā)生變化后,通知到訂閱管理服務(wù),訂閱管理服務(wù)再依次通知所有觀察者,這個(gè)過(guò)程是阻塞的,有可能訂閱的觀察者非常多,或者觀察者需要做一些耗時(shí)的操作,會(huì)阻塞很長(zhǎng)的時(shí)間,所以在觀察者中要采用異步的方法來(lái)避免長(zhǎng)時(shí)間的阻塞。
總結(jié)
以上是生活随笔為你收集整理的java观察者模式在spring中的应用_在Spring中使用观察者模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: ustc小道消息20211229
- 下一篇: ustc小道消息20211227