《設(shè)計(jì)模式》第23章:觀察者模式_第1頁
《設(shè)計(jì)模式》第23章:觀察者模式_第2頁
《設(shè)計(jì)模式》第23章:觀察者模式_第3頁
《設(shè)計(jì)模式》第23章:觀察者模式_第4頁
《設(shè)計(jì)模式》第23章:觀察者模式_第5頁
已閱讀5頁,還剩28頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第23章觀察者模式本章教學(xué)內(nèi)容觀察者模式模式動(dòng)機(jī)與定義模式結(jié)構(gòu)與分析模式實(shí)例與解析模式效果與應(yīng)用模式擴(kuò)展觀察者模式模式動(dòng)機(jī)觀察者模式模式動(dòng)機(jī)建立一種對象與對象之間的依賴關(guān)系,一個(gè)對象發(fā)生改變時(shí)將自動(dòng)通知其他對象,其他對象將相應(yīng)做出反應(yīng)。在此,發(fā)生改變的對象稱為觀察目標(biāo),而被通知的對象稱為觀察者,一個(gè)觀察目標(biāo)可以對應(yīng)多個(gè)觀察者,而且這些觀察者之間沒有相互聯(lián)系,可以根據(jù)需要增加和刪除觀察者,使得系統(tǒng)更易于擴(kuò)展,這就是觀察者模式的模式動(dòng)機(jī)。觀察者模式模式定義觀察者模式(ObserverPattern):定義對象間的一種一對多依賴關(guān)系,使得每當(dāng)一個(gè)對象狀態(tài)發(fā)生改變時(shí),其相關(guān)依賴對象皆得到通知并被自動(dòng)更新。觀察者模式又叫做發(fā)布-訂閱(Publish/Subscribe)模式、模型-視圖(Model/View)模式、源-監(jiān)聽器(Source/Listener)模式或從屬者(Dependents)模式。觀察者模式是一種對象行為型模式。觀察者模式模式定義ObserverPattern:Defineaone-to-manydependencybetweenobjectssothatwhenoneobjectchangesstate,allitsdependentsarenotifiedandupdatedautomatically.Frequencyofuse:high

觀察者模式模式結(jié)構(gòu)觀察者模式模式結(jié)構(gòu)觀察者模式包含如下角色:Subject:目標(biāo)ConcreteSubject:具體目標(biāo)Observer:觀察者ConcreteObserver:具體觀察者觀察者模式模式分析觀察者模式描述了如何建立對象與對象之間的依賴關(guān)系,如何構(gòu)造滿足這種需求的系統(tǒng)。這一模式中的關(guān)鍵對象是觀察目標(biāo)和觀察者,一個(gè)目標(biāo)可以有任意數(shù)目的與之相依賴的觀察者,一旦目標(biāo)的狀態(tài)發(fā)生改變,所有的觀察者都將得到通知。作為對這個(gè)通知的響應(yīng),每個(gè)觀察者都將即時(shí)更新自己的狀態(tài),以與目標(biāo)狀態(tài)同步,這種交互也稱為發(fā)布-訂閱(publish-subscribe)。目標(biāo)是通知的發(fā)布者,它發(fā)出通知時(shí)并不需要知道誰是它的觀察者,可以有任意數(shù)目的觀察者訂閱它并接收通知。觀察者模式模式分析典型的抽象目標(biāo)類代碼如下所示:importjava.util.*;publicabstractclassSubject{protectedArrayListobservers=newArrayList(); publicabstractvoidattach(Observerobserver); publicabstractvoiddetach(Observerobserver); publicabstractvoidnotify();}觀察者模式模式分析典型的具體目標(biāo)類代碼如下所示:publicclassConcreteSubjectextendsSubject{ publicvoidattach(Observerobserver) { observers.add(observer); }

publicvoiddetach(Observerobserver) { observers.remove(observer); }

publicvoidnotify() { for(Objectobs:observers) { ((Observer)obs).update(); } } }觀察者模式模式分析典型的抽象觀察者代碼如下所示:publicinterfaceObserver{ publicvoidupdate();}觀察者模式模式分析典型的具體觀察者代碼如下所示:publicclassConcreteObserverimplementsObserver{ publicvoidupdate() { //具體更新代碼

}}觀察者模式模式分析客戶端代碼片段如下所示:Subjectsubject=newConcreteSubject();Observerobserver=newConcreteObserver();subject.attach(observer);subject.notify();觀察者模式模式分析觀察者模式順序圖如下所示:觀察者模式觀察者模式實(shí)例與解析實(shí)例一:貓、狗與老鼠假設(shè)貓是老鼠和狗的觀察目標(biāo),老鼠和狗是觀察者,貓叫老鼠跑,狗也跟著叫,使用觀察者模式描述該過程。觀察者模式觀察者模式實(shí)例與解析實(shí)例一:貓、狗與老鼠觀察者模式觀察者模式實(shí)例與解析實(shí)例一:貓、狗與老鼠參考代碼(Chapter23Observer\sample01)演示……觀察者模式觀察者模式實(shí)例與解析實(shí)例二:自定義登錄控件Java事件處理模型中應(yīng)用了觀察者模式,下面通過一個(gè)實(shí)例來學(xué)習(xí)如何自定義Java控件,并給該控件增加相應(yīng)的事件。該實(shí)例基于JavaSwing/AWT控件,在Swing/AWT的相關(guān)類中封裝了對事件的底層處理。觀察者模式觀察者模式實(shí)例與解析實(shí)例二:自定義登錄控件觀察者模式觀察者模式實(shí)例與解析實(shí)例二:自定義登錄控件參考代碼(Chapter23Observer\sample02)演示……觀察者模式模式優(yōu)缺點(diǎn)觀察者模式的優(yōu)點(diǎn)觀察者模式可以實(shí)現(xiàn)表示層和數(shù)據(jù)邏輯層的分離,并定義了穩(wěn)定的消息更新傳遞機(jī)制,抽象了更新接口,使得可以有各種各樣不同的表示層作為具體觀察者角色。觀察者模式在觀察目標(biāo)和觀察者之間建立一個(gè)抽象的耦合。觀察者模式支持廣播通信。觀察者模式符合“開閉原則”的要求。觀察者模式模式優(yōu)缺點(diǎn)觀察者模式的缺點(diǎn)如果一個(gè)觀察目標(biāo)對象有很多直接和間接的觀察者的話,將所有的觀察者都通知到會(huì)花費(fèi)很多時(shí)間。如果在觀察者和觀察目標(biāo)之間有循環(huán)依賴的話,觀察目標(biāo)會(huì)觸發(fā)它們之間進(jìn)行循環(huán)調(diào)用,可能導(dǎo)致系統(tǒng)崩潰。觀察者模式?jīng)]有相應(yīng)的機(jī)制讓觀察者知道所觀察的目標(biāo)對象是怎么發(fā)生變化的,而僅僅只是知道觀察目標(biāo)發(fā)生了變化。觀察者模式模式適用環(huán)境在以下情況下可以使用觀察者模式:一個(gè)抽象模型有兩個(gè)方面,其中一個(gè)方面依賴于另一個(gè)方面。將這些方面封裝在獨(dú)立的對象中使它們可以各自獨(dú)立地改變和復(fù)用。一個(gè)對象的改變將導(dǎo)致其他一個(gè)或多個(gè)對象也發(fā)生改變,而不知道具體有多少對象將發(fā)生改變,可以降低對象之間的耦合度。一個(gè)對象必須通知其他對象,而并不知道這些對象是誰。需要在系統(tǒng)中創(chuàng)建一個(gè)觸發(fā)鏈,A對象的行為將影響B(tài)對象,B對象的行為將影響C對象……,可以使用觀察者模式創(chuàng)建一種鏈?zhǔn)接|發(fā)機(jī)制。觀察者模式模式應(yīng)用(1)JDK1.1版本及以后的各個(gè)版本中,事件處理模型采用基于觀察者模式的委派事件模型(DelegationEventModel,DEM)。在DEM中,事件的發(fā)布者稱為事件源(EventSource),而訂閱者叫做事件監(jiān)聽器(EventListener),在這個(gè)過程中還可以通過事件對象(EventObject)來傳遞與事件相關(guān)的信息,可以在事件監(jiān)聽者的實(shí)現(xiàn)類中實(shí)現(xiàn)事件處理,因此事件監(jiān)聽對象又可以稱為事件處理對象。事件源對象、事件監(jiān)聽對象(事件處理對象)和事件對象構(gòu)成了Java事件處理模型的三要素。觀察者模式模式應(yīng)用(2)除了AWT中的事件處理之外,Java語言解析XML的技術(shù)SAX2以及Servlet技術(shù)的事件處理機(jī)制都基于DEM,它們都是觀察者模式的應(yīng)用。(3)觀察者模式在軟件開發(fā)中應(yīng)用非常廣泛,如某電子商務(wù)網(wǎng)站可以在執(zhí)行發(fā)送操作后給用戶多個(gè)發(fā)送商品打折信息,某團(tuán)隊(duì)?wèi)?zhàn)斗游戲中某隊(duì)友犧牲將給所有成員提示等等,凡是涉及到一對一或者一對多的對象交互場景都可以使用觀察者模式。

觀察者模式模式擴(kuò)展Java語言提供的對觀察者模式的支持在JDK的java.util包中,提供了Observable類以及Observer接口,它們構(gòu)成了Java語言對觀察者模式的支持。觀察者模式模式擴(kuò)展Java語言提供的對觀察者模式的支持Observer接口

Observable類

Observable()addObserver(Observero)deleteObserver(Observero)notifyObservers()、notifyObservers(Objectarg)deleteObserverssetChanged()clearChanged()hasChanged()countObservers()voidupdate(Observableo,Objectarg);觀察者模式模式擴(kuò)展MVC模式MVC模式是一種架構(gòu)模式,它包含三個(gè)角色:模型(Model),視圖(View)和控制器(Controller)。觀察者模式可以用來實(shí)現(xiàn)MVC模式,觀察者模式中的觀察目標(biāo)就是MVC模式中的模型(Model),而觀察者就是MVC中的視圖(View),控制器(Controller)充當(dāng)兩者之間的中介者(Mediator)。當(dāng)模型層的數(shù)據(jù)發(fā)生改變時(shí),視圖層將自動(dòng)改變其顯示內(nèi)容。觀察者模式模式擴(kuò)展MVC模式/technetwork/articles/javase/index-142890.html

本章小結(jié)觀察者模式定義對象間的一種一對多依賴關(guān)系,使得每當(dāng)一個(gè)對象狀態(tài)發(fā)生改變時(shí),其相關(guān)依賴對象皆得到通知并被自動(dòng)更新。觀察者模式又叫做發(fā)布-訂閱模式、模型-視圖模式、源-監(jiān)聽器模式或從屬者模式。觀察者模式是一種對象行為型模式。觀察者模式包含四個(gè)角色:目標(biāo)又稱為主題,它是指被觀察的對象;具體目標(biāo)是目標(biāo)類的子類,通常它包含有經(jīng)常發(fā)生改變的數(shù)據(jù),當(dāng)它的狀態(tài)發(fā)生改變時(shí),向它的各個(gè)觀察者發(fā)出通知;觀察者將對觀察目標(biāo)的改變做出反應(yīng);在具體觀察者中維護(hù)一個(gè)指向具體目標(biāo)對象的引用,它存儲(chǔ)具體觀察者的有關(guān)狀態(tài),這些狀態(tài)需要和具體目標(biāo)的狀態(tài)保持一致。觀察者模式定義了一種一對多的依賴關(guān)系,讓多個(gè)觀察者對象同時(shí)監(jiān)聽某一個(gè)目標(biāo)對象,當(dāng)這個(gè)目標(biāo)對象的狀態(tài)發(fā)生變化時(shí),會(huì)通知所有觀察者對象,使它們能夠自動(dòng)更新。本章小結(jié)觀察者模式的主要優(yōu)點(diǎn)在于可以實(shí)現(xiàn)表示層和數(shù)據(jù)邏輯層的分離,并在觀察目標(biāo)和觀察者之間建立一個(gè)抽象的耦合,支持廣播通信;其主要缺點(diǎn)在于如果一個(gè)觀察目標(biāo)對象有很多直接和間接的觀察者的話,將所有的觀察者都通知到會(huì)花費(fèi)很多時(shí)間,而且如果在觀察者和

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論