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

下載本文檔

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

文檔簡介

1、河南理工大學(xué)程序設(shè)計(jì)模式結(jié)課論文2012 2013學(xué)年第2學(xué)期論文題目關(guān)于observer模式的學(xué)習(xí)學(xué)生姓名學(xué) 號專業(yè)班級 軟件工程javalo-6班指導(dǎo)教師2013 年 7 月 3 日目錄摘要11. observer(觀察者模式)概述 22. observer(觀察者模式)的定義 23. observer(觀察者模式)的結(jié)構(gòu)和使用 34. observer白勺優(yōu)缺點(diǎn)45. 適合使用observer的情景56. observer在 java 中白勺應(yīng)用 67. 綜合應(yīng)用舉例88. 參考文獻(xiàn)10摘要設(shè)計(jì)模式(design pattern)是針對有一類問題的最佳解決方案,解決了在 某種特定情景中重

2、復(fù)發(fā)生的某個(gè)問題。設(shè)計(jì)模式在程序設(shè)計(jì)中應(yīng)用廣泛,其遵循 一定的編程模式,使自己的代碼便于理解,易于交流。一個(gè)好的設(shè)計(jì)系統(tǒng)往往是 易維護(hù)、易擴(kuò)展、易復(fù)用的。設(shè)計(jì)模式的目的不是針對軟件設(shè)計(jì)和開發(fā)中的每個(gè)問題都給出解決方案,而 是針對某種特定環(huán)境中通常都會(huì)遇到的某種軟件開發(fā)問題給出的可重用的一些 解決方案,因此學(xué)習(xí)設(shè)計(jì)模式不僅可以使我們用好這些成功的模式,更重要的是 可以是我們更加深刻的理解而向?qū)ο蟮脑O(shè)計(jì)思想,有利于更好的地使用而向?qū)﹀?語言解決設(shè)計(jì)屮的問題。模式不使用理論推導(dǎo)出來的,而是從真實(shí)世界的軟件系 統(tǒng)中被發(fā)現(xiàn)、按著一定規(guī)范總結(jié)出來的可以被復(fù)用的方案。在尋找新的模式之前, 必須先精通現(xiàn)有的模

3、式。通過研究學(xué)習(xí)現(xiàn)有的模式,可以比較容易地識別模式。面向?qū)ο蟪绦蛟O(shè)計(jì)中有很多種設(shè)計(jì)模式,大致可以分為三類:structural (結(jié)構(gòu)型),behavioral (行為型),creational (創(chuàng)建型)。在課堂上,老師已 經(jīng)講過創(chuàng)建型模式和結(jié)構(gòu)型模式所包含的共12種設(shè)計(jì)模式,本文所介紹的是 observer (觀察者)設(shè)計(jì)模式,其屬于behavioral模式。觀察者模式(有吋又 被稱為發(fā)布/訂閱模式)是軟件設(shè)計(jì)模式的一種。在此種模式中,一個(gè)目標(biāo)對象 管理所有相依于它的觀察者對象,并且在它本身的狀態(tài)改變時(shí)主動(dòng)發(fā)出通知。這 通常透過呼叫各觀察者所提供的方法來實(shí)現(xiàn)。此種模式通常被用來實(shí)作事件處理

4、 系統(tǒng)。本文主要介紹了 observer (觀察者)設(shè)計(jì)模式相關(guān)理論性知識與實(shí)踐應(yīng)用, 通過對observer (觀察者)設(shè)計(jì)模式的分析、理解、學(xué)習(xí)和掌握,以加深對java 中的接口或抽象類應(yīng)用的理解。關(guān)鍵詞:設(shè)計(jì)模式 面向?qū)ο髈bserver (觀察者)設(shè)計(jì)模式 理論與實(shí)踐應(yīng)用關(guān)于observer模式的學(xué)習(xí)1. observer (觀察者模式)概述觀察者模式(有時(shí)又被稱為發(fā)布-訂閱模式、模型-視圖模式、源-收聽者模 式或從屬者模式)是軟件設(shè)計(jì)模式的一種。在此種模式中,一個(gè)目標(biāo)物件管理所 有相依于它的觀察者物件,并且在它本身的狀態(tài)改變時(shí)主動(dòng)發(fā)出通知。這通常透 過呼叫各觀察者所提供的方法來實(shí)現(xiàn)。

5、此種模式通常被用來實(shí)作事件處理系統(tǒng)。 觀察者模式(observer)完美的將觀察者和被觀察的對彖分離開。舉個(gè)例子,用 戶界面可以作為一個(gè)觀察者,業(yè)務(wù)數(shù)據(jù)是被觀察者,用戶界面觀察業(yè)務(wù)數(shù)據(jù)的變 化,發(fā)現(xiàn)數(shù)據(jù)變化后,就顯示在界面上。面向?qū)ο笤O(shè)計(jì)的一個(gè)原則是:系統(tǒng)中的 每個(gè)類將重點(diǎn)放在某一個(gè)功能上,而不是其他方面。一個(gè)對象只做一件事情,并 且將他做好。觀察者模式在模塊之間劃定了清晰的界限,提高了應(yīng)用程序的可維 護(hù)性和重用性。實(shí)現(xiàn)觀察者模式的吋候要注意,觀察者和被觀察對象之間的互動(dòng)關(guān)系不能體 現(xiàn)成類之間的直接調(diào)用,否則就將使觀察者和被觀察對象之間緊密的耦合起來, 從根本上違反面向?qū)ο蟮脑O(shè)計(jì)的原則。無論是

6、觀察者“觀察”觀察對象,還是被 觀察者將自己的改變“通知”觀察者,都不應(yīng)該直接調(diào)用。2. observer觀察者模式)的定義根據(jù)gof所著design patterns中所述,observer模式可定義為:observer (觀察者模式)的定義為:defines a one-to-many dependency between objects so that when one objeet changes state, all its dependents are notified and updated automatically.即定義對象間的一種一對多的依賴關(guān)系,當(dāng)一個(gè) 對象的狀態(tài)發(fā)生變

7、化時(shí),多有依賴他的對象都得到通知并被自動(dòng)更新。觀察者:(observer)將自己注冊到被觀察對象(subject)中,被觀察對象將觀 察者存放在一個(gè)容器(container)里。被觀察:被觀察對象發(fā)生了某種變化(如圖中的somcchangc),從容器中得到所 有注冊過的觀察者,將變化通知觀察者。在此種模式中,一個(gè)冃標(biāo)對彖管理所有相依于它的觀察者對彖,并且在它本 身的狀態(tài)改變時(shí)主動(dòng)發(fā)出通知。這通常透過呼叫各觀察者所提供的方法來實(shí)現(xiàn)。3. observer (觀察者模式)的結(jié)構(gòu)和使用觀察者模式的組成部分:(1) 抽象目標(biāo)角色(subject):目標(biāo)角色知道它的觀察者,可以有任意多個(gè)觀察 者觀察同一

8、個(gè)目標(biāo)。并且提供注冊和刪除觀察者對象的接口。此抽象類別提供一 個(gè)接口讓觀察者進(jìn)行添附與解附作業(yè)。類別內(nèi)有個(gè)不公開的觀察者串煉,并透過 下列函式(方法)進(jìn)行作業(yè)添附(attach):新增觀察者到串煉內(nèi),以追蹤目標(biāo)對彖的變化。解附(detach):將已經(jīng)存在的觀察者從串煉中移除。通知(notify):利用觀察者所提供的更新函式來通知此目標(biāo)己經(jīng)產(chǎn)牛變化。添附函式包涵了一個(gè)觀察者對象參數(shù)。也許是觀察者類別的虛擬函式(即更新函 式),或是在非面向?qū)ο蟮脑O(shè)定中所使用的函式指標(biāo)(更廣泛來講,函式子或是函 式對彖)o(2) 抽象觀察者角色(observer):該類別是一個(gè)必須被實(shí)做的抽象類別。這個(gè)類 別定義了

9、所有觀察者都擁有的更新用接口,此接口是用來接收目標(biāo)類別所發(fā)出的 更新通知。此類別含有以下函式更新(update):會(huì)被實(shí)做的一個(gè)抽象(虛擬)函式。(3) 具體目標(biāo)角色(concrete subject):提供了觀察者欲追蹤的狀態(tài),并將有關(guān) 狀態(tài)存入各個(gè)concrete observer對彖。利用其源類別(例如前述的抽彖fl標(biāo)類 別)所提供的方法,來通知所有的觀察者其狀態(tài)已經(jīng)更新。此類別擁有函式取得狀 態(tài)(getstate):回傳該目標(biāo)對象的狀態(tài)。(4) 具體觀察者角色(concrete observer):存儲(chǔ)有關(guān)狀態(tài),這些狀態(tài)應(yīng)與目標(biāo) 的狀態(tài)保持一致。這個(gè)類別含有指向目標(biāo)類別的參考(refe

10、rence),以接收來自 目標(biāo)類別的更新狀態(tài)。實(shí)現(xiàn)observer的更新接口以使自身狀態(tài)與fl標(biāo)的狀態(tài)保 持一致。在本角色內(nèi)也可以維護(hù)一個(gè)指向concrete subject對象的引用。此類 別含有以下函式更新(update):是前述抽象函式的實(shí)做。當(dāng)這個(gè)函式被目標(biāo)對象 呼叫時(shí),觀察者對象將會(huì)呼叫目標(biāo)對象的取得狀態(tài)函式,來其所擁有的更新目標(biāo) 對象資訊。每個(gè)觀察者類別都要實(shí)做它自己的更新函式,以應(yīng)對狀態(tài)更新的情形。當(dāng)冃 標(biāo)對象改變時(shí),會(huì)通過呼叫它自己的通知函式來將通知送給每一個(gè)觀察者對象, 這個(gè)通知函式則會(huì)去呼叫已經(jīng)添附在串煉內(nèi)的觀察者更新函式。通知與更新函式 可能會(huì)有一些參數(shù),好指明是目前目標(biāo)

11、對象內(nèi)的何種改變。這么作將可增進(jìn)觀察 者的效率(只更新那些改變部份的狀態(tài))。觀察者模式的uml類圖結(jié)構(gòu):4. observer的優(yōu)缺點(diǎn)observer模式的優(yōu)點(diǎn)是實(shí)現(xiàn)了表示層和數(shù)據(jù)邏輯層的分離,并定義了穩(wěn)定 的更新消息傳遞機(jī)制,類別清晰,并抽象了更新接口,使得可以有各種各樣不同 的表示層(觀察者)。但是其缺點(diǎn)是每個(gè)外觀對象必須繼承這個(gè)抽像出來的接口 類,這樣就造成了一些不方便,比如有一個(gè)別人寫的外觀對象,并沒有繼承該抽 象類,或者接口不對,我們又希望不修改該類直接使用它。雖然可以再應(yīng)用 adapter模式來一定程度上解決這個(gè)問題,但是會(huì)造成更加復(fù)雜煩瑣的設(shè)計(jì),增 加出錯(cuò)兒率。觀察者模式的效果有

12、以下幾個(gè)優(yōu)點(diǎn):(1)觀察者模式在被觀察者和觀察者z間建立一個(gè)抽彖的耦合。被觀察者角色 所知道的只是一個(gè)具體現(xiàn)察者聚集,每一個(gè)具體現(xiàn)察者都符合一個(gè)抽象觀 察者的接口。被觀察者并不認(rèn)識任何一個(gè)具體觀察者,它只知道它們都有 一個(gè)共同的接口。由于被觀察者和觀察者沒有緊密地耦合在一起,因此它 們可以屬于不同的抽象化層次。(2) 觀察者模式支持廣播通信。被觀察者會(huì)向所有的登記過的觀察者發(fā)出通知。 觀察者模式有下面的一些缺點(diǎn):(1) 如果一個(gè)被觀察者對象有很多直接和間接的觀察者的話,將所有的觀察者 都通知到會(huì)花費(fèi)很多時(shí)間。(2) 如果在被觀察者之間有循環(huán)依賴的話,被觀察者會(huì)觸發(fā)它們之間進(jìn)行循環(huán) 調(diào)用,導(dǎo)致系

13、統(tǒng)崩潰。在使用觀察考模式時(shí)要特別注意這一點(diǎn)。(3) 如果對觀察者的通知是通過另外的線程進(jìn)行界步投遞的話,系統(tǒng)必須保證 投遞是以自恰的方式進(jìn)行的。(4) 雖然觀察者模式可以隨時(shí)使觀察者知道所觀察的對象發(fā)生了變化,但是觀 察者模式?jīng)]有相應(yīng)的機(jī)制使觀察者知道所觀察的對象是怎么發(fā)生變化的。5.適合使用observer的情景課本中所介紹的適合使用observer的情景有兩種,一種是當(dāng)一個(gè)對象的數(shù) 據(jù)更新是需要通知其他對象,但這個(gè)對象又不希望和被通知的那些對象形成緊耦 合,即封裝這些層面在單獨(dú)的對象內(nèi)將可允許程式設(shè)計(jì)師單獨(dú)地去變更與重復(fù)使 用這些對象,而不會(huì)產(chǎn)生兩者之間交互的問題。另一種是當(dāng)一個(gè)對象的數(shù)據(jù)

14、更新 時(shí),這個(gè)對彖需要讓其他對彖也各自更行自己的數(shù)據(jù),但這個(gè)對彖不知道具體有 多少個(gè)對象需要更新數(shù)據(jù)。除此之外,我還查找了一些其他適于應(yīng)用該模式的情況,如:當(dāng)對象應(yīng)該有 能力通知其他對象,乂不應(yīng)該知道其他對象的實(shí)做細(xì)節(jié)時(shí),也可以用觀察者模式。觀察者模式通常與mvc范式有關(guān)系。在mvc中,觀察者模式被用來降低 model與view的耦合程度。一般而言,model的改變會(huì)觸發(fā)通知其他身為觀 察者的model o而這些model實(shí)際上是view。java swing就是個(gè)范例,示 意了 model預(yù)期會(huì)透過propertychangenotification架構(gòu)以送tb改變的通知 給其他view。m

15、odel類別是java bean類別的一員,并擁有與上述目標(biāo)類別 同樣的行為。view類別則系結(jié)了一些gui中的可視元素,并擁有與上述觀察 者類別同樣的行為。當(dāng)應(yīng)用程式在執(zhí)行時(shí)。使用者將因view做岀相應(yīng)的更新而 看見model所產(chǎn)生的變更。6. observer在java中的應(yīng)用在java中通過observable類和observer接口實(shí)現(xiàn)了觀察者模式oobserver 對象是觀察者,observable對象是被觀察者。實(shí)現(xiàn)觀察者模式(1) 創(chuàng)建被觀察者類,它繼承自java. util. observable類;(2) 創(chuàng)建觀察者類,它實(shí)現(xiàn)java. util. observer接口;(3

16、) 對于被觀察者類,i > 添加它的觀察者:void addobserver(observer o)addobserver()方法 把觀察者對象添加到觀察者對象列表中。ii、當(dāng)被觀察事件發(fā)生時(shí),執(zhí)行:setchanged():notifyobservers(): setchangeo方法用來設(shè)置一個(gè)內(nèi)部標(biāo)志位注明數(shù)據(jù)發(fā)生了變化; notifyobservers ()方法會(huì)去調(diào)用觀察者對象列表屮所有的observer的 update()方法,通知它們數(shù)據(jù)發(fā)生了變化。只有在setchange()被調(diào)用后, notifyobservers ()才會(huì)去調(diào)用 update ()。對于觀察者類,實(shí)現(xiàn)

17、observer接口的唯一方法update void update (observable o, object arg)形參 object arg,對應(yīng)一個(gè)由 notifyobservers (object arg);傳遞來的參數(shù), 當(dāng)執(zhí)行的是 notifyobservers();時(shí),arg 為 nul 1。以下是電了商務(wù)實(shí)例中關(guān)于observer的應(yīng)用:當(dāng)下網(wǎng)上商店形式多樣,每個(gè)站點(diǎn)有自己的特色,但也有其一般的共性,單就“商 品的變化,以便及時(shí)通知訂戶”這一點(diǎn),是很多網(wǎng)上商店共有的模式,這一模式 類似observer pattern觀察者模式。具體的說,如果網(wǎng)上商店中商品在名稱、價(jià)格等方面有

18、變化,如果系統(tǒng)能自動(dòng)通 知會(huì)員,將是網(wǎng)上商店區(qū)別傳統(tǒng)商店的一大特色。這就需要在商品product中加 入observer這樣角色,以便product細(xì)節(jié)發(fā)生變化時(shí),observer能自動(dòng)觀察到 這種變化,并能進(jìn)行及時(shí)的update或not辻y動(dòng)作。具體代碼如下:/產(chǎn)甜類 可供jsp直接使用uscbcan調(diào)用該類,主要執(zhí)行產(chǎn)品數(shù)據(jù)庫插入、更 新publ ic class product extends observableprivate string name;private float price;public string getnameo return name;public void s

19、etname(string name) this. name=name;/設(shè)置變化點(diǎn)sctchangedo ;notifyobservers(name);!public float getprice() return price;public void setprice(float price)this. price=price;/設(shè)置變化點(diǎn)setchangedo ;notifyobservers (new float (price);i/以下可以是數(shù)據(jù)庫更新插入命令.public void savetodb()我們注意到,在product類中的setxxx方法中,我們設(shè)置了 notify (

20、通知) 方法,當(dāng)jsp表單調(diào)用setxxx,實(shí)際上就觸發(fā)了 notisfyobservers方法,這將 通知相應(yīng)觀察者應(yīng)該采取行動(dòng)了。7. 綜合應(yīng)用舉例該例子演示了:老師有電話號碼,學(xué)生需要知道老師的電話號碼以便于在合 時(shí)的時(shí)候撥打,在這樣的組合中,老師就是一個(gè)被觀察者(subject),學(xué)生就是 需要知道信息的觀察者(obsewec,當(dāng)老師的電話號碼發(fā)生改變時(shí),學(xué)生得到 通知,并更新相應(yīng)的電話記錄。/ subject 代碼package observer;import java.util.observer;public interface subject public void attach

21、(observer o);public void detach(observer o);public void notice();/ observer 代碼package observer;public in terface observer public void update);/ teacher 代碼package observer;import java.util.vector;public class teacher implements subjectprivate string phone;private vector students;public teacher()phone

22、 =u"stude nts = new vector();public void attach(observer o)stude nts.add(o);public void detach(observer o)stude nts.remove(o);public void notice()for(int i=o;i<students.size();i+)(observer)stud en ts.get(i).updated;public void setphone(string phone)this.ph one = phone;no tice();public string

23、 getphone() return phone; overridepublic void attach(java.util.observer o) /todo auto-generated method stub overridepublic void detach(java.util.observer o) / todo auto-generated method stub/ student 代碼package observer;import java.util.observable;import java.util.observer;public class student implem

24、ents observerprivate string name;private string phone;private teacher teacher;public student(string name,teacher t)this, name = n ame;teacher = t;public void show()system.out.printlnc'name:11+name+nleaches phone:h+this.getteacher().getphone();public void update()pho ne = this.getteacher().getpho

25、ne();(©overridepublic void update(observable o, object arg) / todo auto-generated method stub/client 代碼package observer;import java.util.vector;public class clientpublic static void main(string args)vector students = new vector);teacher t = new teacher();forfint i= 0 ;i<10;i+)student st = ne

26、w student(h軟件 lojavar+it);students.add(st);t.attach(st);t.setphone(quot;);for(int i=0;i<10;i«+)(stude nt)stude nts.get(i).show();t.setphone("quot;);forfint i=0;i<10;i+) (student)students.get(i).show();運(yùn)行結(jié)果截圖:nair.e :軟件10匚己$己:0teacher phenenair.e :軟件logva teacher呂 phonenair.e :軟件lorva teach皂phon皂name :軟件 10 jas teacherphonename:軟件 lojava teacher's phonename:軟件 10 java teacherphonename :軟件lojavateachers phonenair.e :軟件teacher's phonezaire :軟件locvateacher phonenair.e :teacher's uhene0391-777777710391-777

溫馨提示

  • 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

提交評論