在 Java8 環(huán)境下實(shí)現(xiàn)觀察者模式的實(shí)例分析
大?。?/span>0.5 MB 人氣: 2017-10-12 需要積分:1
推薦 + 挑錯(cuò) + 收藏(0) + 用戶評(píng)論(0)
標(biāo)簽:JAVA(102450)
觀察者(Observer)模式又名發(fā)布-訂閱(Publish/Subscribe)模式,是四人組(GoF,即 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides)在1994合著的《設(shè)計(jì)模式:可復(fù)用面向?qū)ο筌浖幕A(chǔ)》中提出的(詳見書中293-313頁(yè))。盡管這種模式已經(jīng)有相當(dāng)長(zhǎng)的歷史,它仍然廣泛適用于各種場(chǎng)景,甚至成為了標(biāo)準(zhǔn)Java庫(kù)的一個(gè)組成部分。目前雖然已經(jīng)有大量關(guān)于觀察者模式的文章,但它們都專注于在 Java 中的實(shí)現(xiàn),卻忽視了開發(fā)者在Java中使用觀察者模式時(shí)遇到的各種問(wèn)題。本文的寫作初衷就是為了填補(bǔ)這一空白:本文主要介紹通過(guò)使用 Java8 架構(gòu)實(shí)現(xiàn)觀察者模式,并在此基礎(chǔ)上進(jìn)一步探討關(guān)于經(jīng)典模式的復(fù)雜問(wèn)題,包括匿名內(nèi)部類、lambda 表達(dá)式、線程安全以及非平凡耗時(shí)長(zhǎng)的觀察者實(shí)現(xiàn)。本文內(nèi)容雖然并不全面,很多這種模式所涉及的復(fù)雜問(wèn)題,遠(yuǎn)不是一篇文章就能說(shuō)清的。但是讀完本文,讀者能了解什么是觀察者模式,它在Java中的通用性以及如何處理在 Java 中實(shí)現(xiàn)觀察者模式時(shí)的一些常見問(wèn)題。
觀察者模式
根據(jù) GoF 提出的經(jīng)典定義,觀察者模式的主旨是:
定義對(duì)象間的一種一對(duì)多的依賴關(guān)系,當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生改變時(shí),所有依賴于它的對(duì)象都得到通知并被自動(dòng)更新。
什么意思呢?很多軟件應(yīng)用中,對(duì)象之間的狀態(tài)都是互相依賴的。例如,如果一個(gè)應(yīng)用專注于數(shù)值數(shù)據(jù)加工,這個(gè)數(shù)據(jù)也許會(huì)通過(guò)圖形用戶界面(GUI)的表格或圖表來(lái)展現(xiàn)或者兩者同時(shí)使用,也就是說(shuō),當(dāng)?shù)讓訑?shù)據(jù)更新時(shí),相應(yīng)的 GUI 組件也要更新。問(wèn)題的關(guān)鍵在于如何做到底層數(shù)據(jù)更新時(shí) GUI 組件也隨之更新,同時(shí)盡量減小 GUI 組件和底層數(shù)據(jù)的耦合度。
一種簡(jiǎn)單且不可擴(kuò)展的解決方案是給管理這些底層數(shù)據(jù)的對(duì)象該表格和圖像 GUI 組件的引用,使得對(duì)象可以在底層數(shù)據(jù)變化時(shí)能夠通知 GUI 組件。顯然,對(duì)于處理有更多 GUI 組件的復(fù)雜應(yīng)用,這個(gè)簡(jiǎn)單的解決方案很快顯示出其不足。例如,有20個(gè) GUI 組件都依賴于底層數(shù)據(jù),那么管理底層數(shù)據(jù)的對(duì)象就需要維護(hù)指向這20個(gè)組件的引用。隨著依賴于相關(guān)數(shù)據(jù)的對(duì)象數(shù)量的增加,數(shù)據(jù)管理和對(duì)象之間的耦合度也變得難以控制。
另一個(gè)更好的解決方案是允許對(duì)象注冊(cè)獲取感興趣數(shù)據(jù)更新的權(quán)限,當(dāng)數(shù)據(jù)變化時(shí),數(shù)據(jù)管理器就會(huì)通知這些對(duì)象。通俗地說(shuō)就是,讓感興趣的數(shù)據(jù)對(duì)象告訴管理器:“當(dāng)數(shù)據(jù)變化時(shí)請(qǐng)通知我”。此外,這些對(duì)象不僅可以注冊(cè)獲取更新通知,也可以取消注冊(cè),保證數(shù)據(jù)管理器在數(shù)據(jù)變化時(shí)不再通知該對(duì)象。在 GoF 的原始定義中,注冊(cè)獲取更新的對(duì)象叫作“觀察者”(observer),對(duì)應(yīng)的數(shù)據(jù)管理器叫作“目標(biāo)”(Subject),觀察者感興趣的數(shù)據(jù)叫作“目標(biāo)狀態(tài)”,注冊(cè)過(guò)程叫“添加”(attach),撤銷觀察的過(guò)程叫“移除”(detach)。前文已經(jīng)提到觀察者模式又叫發(fā)布-訂閱模式,可以理解為客戶訂閱關(guān)于目標(biāo)的觀察者,當(dāng)目標(biāo)狀態(tài)更新時(shí),目標(biāo)把這些更新發(fā)布給訂閱者(這種設(shè)計(jì)模式擴(kuò)展為通用架構(gòu),稱為發(fā)布——訂閱架構(gòu))。這些概念可以用下面的類圖表示:

非常好我支持^.^
(0) 0%
不好我反對(duì)
(0) 0%