資源描述:
《設(shè)計模式 - 觀察者模式》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫。
1、設(shè)計模式讀書筆記-----觀察者模式學(xué)習(xí)設(shè)計模式已經(jīng)有段時間了,這是總結(jié)的第一篇博客,文中有錯誤、漏洞之處,望各位支出,改正。觀察者模式一、基本定義何謂觀察者模式?觀察者模式定義了對象之間的一對多依賴關(guān)系,這樣一來,當(dāng)一個對象改變狀態(tài)時,它的所有依賴者都會收到通知并且自動更新。在這里,發(fā)生改變的對象稱之為觀察目標(biāo),而被通知的對象稱之為觀察者。一個觀察目標(biāo)可以對應(yīng)多個觀察者,而且這些觀察者之間沒有相互聯(lián)系,所以么可以根據(jù)需要增加和刪除觀察者,使得系統(tǒng)更易于擴(kuò)展。觀察者模式又稱為發(fā)布-訂閱模式。二、基本結(jié)構(gòu)首先先看觀察者模式的UML類圖。分析:Subject:目標(biāo)
2、。他把所有對觀察者對戲的引用保存在一個聚集里,每一個主題都可以有多個觀察者。Observer:觀察者。為所有的具體觀察者定義一個接口,在得到主題的通知時能夠及時的更新自己。ConcreteSubject:具體主題。將有關(guān)狀態(tài)存入具體觀察者對象。在具體主題發(fā)生改變時,給所有的觀察者發(fā)出通知。ConcreteObserver:具體觀察者。實現(xiàn)抽象觀察者角色所要求的更新接口,以便使本身的狀態(tài)與主題狀態(tài)相協(xié)調(diào)。三、實現(xiàn)觀察者模式情景是這樣的:在氣象觀測站中,它能夠追蹤目前的天氣狀況,包括溫度、適度、氣壓。需要實現(xiàn)一個布告板,能夠分別顯示目前的狀態(tài),氣象統(tǒng)計和簡單的預(yù)報
3、。當(dāng)氣象站中獲取最新的測量數(shù)據(jù)時,三種布告板必須實時更新。下面是這個案例的設(shè)計圖:編碼實現(xiàn):主題接口Subject.java1publicinterfaceSubject{2/**3*注冊觀察者4*@paramobserver5*/6publicvoidregisterObserver(Observerobserver);78/**9*刪除觀察者10*@paramobserver11*/12publicvoidremoveOberver(Observerobserver);1314/**15*當(dāng)主題狀態(tài)發(fā)生改變時,這個方法需要被調(diào)用,以通知所有觀察者16*/1
4、7publicvoidnotifyObserver();18}觀察者接口Observer.java1publicinterfaceObserver{2publicvoidupdate(floattemp,floathumidity,floatpressure);3}布告板顯示接口DisplayElement.java1publicinterfaceDisplayElement{2publicvoiddisplay();3}WeatherData實現(xiàn)主題接口WeatherData.java1publicclassWeatherDataimplementsSubj
5、ect{2privateListobservers;3privatefloattempterature;4privatefloatpressure;5privatefloathumidity;67publicWeatherData(){8observers=newArrayList();9}1011@Override12publicvoidnotifyObserver(){13for(inti=0;i6、observer.update(tempterature,humidity,pressure);16}17}1819@Override20publicvoidregisterObserver(Observerobserver){21observers.add(observer);22}2324@Override25publicvoidremoveOberver(Observerobserver){26inti=observers.indexOf(observer);27if(i>=0){28observers.remove(i);29}30}3132/**33
7、*氣象站得到更新的觀測數(shù)據(jù)時,通知觀察者34*/35publicvoidmeasurementChanged(){36notifyObserver();37}3839publicvoidsetMeasurements(floattemperature,floathumidity,floatpressure){40this.tempterature=temperature;41this.humidity=humidity;42this.pressure=pressure;43measurementChanged();44}45}布告板CurrentConditu
8、onDisplay.java1publ