觀察者(Observer)模式_第1頁
觀察者(Observer)模式_第2頁
觀察者(Observer)模式_第3頁
觀察者(Observer)模式_第4頁
觀察者(Observer)模式_第5頁
已閱讀5頁,還剩25頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、觀察者(Observer)模式 目的: 在多個對象之間建立一對多的關(guān)系,當(dāng)一個對象改變時,其它所有的依賴對象自動發(fā)生改變。 這個對象叫作被觀察者(Subject),其它依賴的對象叫做觀察者(Observer)。也叫作:Dependents(依賴, Publish-Subscribe(發(fā)布-訂閱), Model-View使用場合 內(nèi)容和顯示分離,視圖同步。如:Observer模式(三) Struct Participants Subject、ConcreteSubject、Observer、ConcreteObserverObserver模式 Collaborations一個簡單例子 Obser

2、ver接口public interface Observer public abstract void update(NumberGenerator generator);兩個Concrete Observer的具體實現(xiàn)public class DigitObserver implements Observer public void update(NumberGenerator generator) System.out.println(DigitObserver: + generator.getNumber(); try Thread.sleep(100); catch (Interrup

3、tedException e) public class GraphObserver implements Observer public void update(NumberGenerator generator) System.out.print(GraphObserver:); int count = generator.getNumber(); for (int i = 0; i count; i+) System.out.print(*); System.out.println(); try Thread.sleep(100); catch (InterruptedException

4、 e) import java.util.Vector;import java.util.Iterator;public abstract class NumberGenerator private Vector observers = new Vector(); / 儲存Observer public void addObserver(Observer observer) / 新增Observer observers.add(observer); public void deleteObserver(Observer observer) / 刪除Observer observers.remo

5、ve(observer); public void notifyObservers() / 通知Observer Iterator it = observers.iterator(); while (it.hasNext() Observer o = (Observer)it.next(); o.update(this); public abstract int getNumber(); / 取得數(shù)值 public abstract void execute(); / 產(chǎn)生數(shù)值import java.util.Random;public class RandomNumberGenerator

6、extends NumberGenerator private Random random = new Random(); / 隨機數(shù)生成器 private int number; / 目前數(shù)值 public int getNumber() / 取得數(shù)值 return number; public void execute() for (int i = 0; i 20; i+) number = random.nextInt(50); notifyObservers(); public class Main public static void main(String args) Number

7、Generator generator = new RandomNumberGenerator(); Observer observer1 = new DigitObserver(); Observer observer2 = new GraphObserver(); generator.addObserver(observer1); generator.addObserver(observer2); generator.execute(); 使用java.util.Observer和java.util.Observable使用java.util.Observerimport java.uti

8、l.*;public class ConcreteSubject extends Observableprivate String name;private float price;public ConcreteSubject(String name, float price) = name;this.price = price;System.out.println(ConcreteSubject ConcreteSubject created: + name + at + price); public String getName() return name; publi

9、c float getPrice() return price; public void setName(String name) = name; setChanged ();notifyObservers(name);public void setPrice(float price) this.price = price;setChanged();notifyObservers(new Float(price);ConcreteSubjectg.javaPriceObserver.javaimport java.util.*;public class PriceObser

10、ver implements Observer private float price;public PriceObserver() price = 0;System.out.println(Price Observercreated: Price currently + price);public void update(Observable obj, Object arg)if (arg instanceof Float)price = (Float)arg).floatValue();System.out. println(PriceObserver : + price); MVC概述概

11、述MVC是Model View Control的縮寫。MVC是軟件設(shè)計的典型模式。在這種設(shè)計模式下,一個應(yīng)用被分為三個部分:Model,View和Controller,每個部分負責(zé)不同的功能。Model是指應(yīng)用程序的數(shù)據(jù)及對這些數(shù)據(jù)的操作;View是指用戶界面;Controller負責(zé)用戶界面和程序數(shù)據(jù)之間的同步,完成兩個方向的動作: -根據(jù)用戶界面(View)的操作完成對程序數(shù)據(jù)(Model)的更新 -將程序數(shù)據(jù)(Model)的改變及時反應(yīng)到用戶界面(View)上 經(jīng)典軟件體系結(jié)構(gòu)經(jīng)典軟件體系結(jié)構(gòu):模型視圖控制器模型視圖控制器(MVC,ModelViewController)??刂破骺刂破髂?/p>

12、型模型視圖視圖在在MVC結(jié)構(gòu)中,結(jié)構(gòu)中,模型模型是軟件應(yīng)用領(lǐng)域中的是軟件應(yīng)用領(lǐng)域中的各種對象,它們的操作獨立于用戶界面;各種對象,它們的操作獨立于用戶界面;視圖視圖則管理用戶界面的輸出;而則管理用戶界面的輸出;而控制器控制器處處理軟件的輸入。理軟件的輸入。輸入事件給出要發(fā)送給模型的消息。一旦輸入事件給出要發(fā)送給模型的消息。一旦模型改變了它的狀態(tài),就立即通過關(guān)聯(lián)機模型改變了它的狀態(tài),就立即通過關(guān)聯(lián)機制通知視圖,讓視圖刷新顯示。這個關(guān)聯(lián)制通知視圖,讓視圖刷新顯示。這個關(guān)聯(lián)機制定義了在模型與各個視圖之間的關(guān)系,機制定義了在模型與各個視圖之間的關(guān)系,它允許模型的運行獨立于與它相關(guān)聯(lián)的視它允許模型的運行

13、獨立于與它相關(guān)聯(lián)的視圖。類似地,控制器在輸入事件發(fā)生時將圖。類似地,控制器在輸入事件發(fā)生時將對視圖及模型進行控制與調(diào)度。對視圖及模型進行控制與調(diào)度。對于對于MVC,可通過開發(fā)模型的一個派生類,可通過開發(fā)模型的一個派生類,履行與應(yīng)用相關(guān)聯(lián)的處理。如用戶界面通履行與應(yīng)用相關(guān)聯(lián)的處理。如用戶界面通過定義視圖和控制器的派生類來建立,這過定義視圖和控制器的派生類來建立,這些派生類中許多是可復(fù)用的類,像按鈕和些派生類中許多是可復(fù)用的類,像按鈕和對話框等,這樣可以直接建立新的子系統(tǒng)。對話框等,這樣可以直接建立新的子系統(tǒng)。 設(shè)計過程的主要活動設(shè)計過程的主要活動1) 系統(tǒng)構(gòu)造系統(tǒng)構(gòu)造:將系統(tǒng)分解為一系列基本的:

14、將系統(tǒng)分解為一系列基本的子系統(tǒng),每一子系統(tǒng)是獨立的軟件成分。子系統(tǒng),每一子系統(tǒng)是獨立的軟件成分。2) 控制建模控制建模:建立系統(tǒng)各部分之間的控制:建立系統(tǒng)各部分之間的控制關(guān)系的一般模型。關(guān)系的一般模型。3) 模塊模塊分解分解:將子系統(tǒng)進一步分解為模塊。:將子系統(tǒng)進一步分解為模塊。一個利用一個利用MVCMVC模式開發(fā)的小例子模式開發(fā)的小例子 利用實現(xiàn)程序,當(dāng)用戶在圖形用戶界面輸入一個球體的半徑時,利用實現(xiàn)程序,當(dāng)用戶在圖形用戶界面輸入一個球體的半徑時,程序?qū)@示該球體的體積與表面積程序?qū)@示該球體的體積與表面積。 該程序主要由三個類構(gòu)成,分別為該程序主要由三個類構(gòu)成,分別為SphereSpher

15、e類、類、TextViewTextView類及類及SphereWindowSphereWindow類。其類。其中中SphereSphere類扮演類扮演ModelModel的角色,的角色,TextViewTextView類為類為ViewView角色,角色,SphereWindowSphereWindow類為類為ControllerController角色。角色。 JavaJava通過專門的類通過專門的類ObservableObservable及及ObserverObserver接口來實現(xiàn)接口來實現(xiàn)MVCMVC編程模式。編程模式。從圖中可以看出,從圖中可以看出,ModelModel類必須繼承類必須

16、繼承ObservableObservable類,類,ViewView類必須實現(xiàn)接口類必須實現(xiàn)接口ObserverObserver由于實現(xiàn)了上述結(jié)構(gòu),當(dāng)模型發(fā)生改變時(控制器改變模型的狀態(tài)),模型就會自動刷由于實現(xiàn)了上述結(jié)構(gòu),當(dāng)模型發(fā)生改變時(控制器改變模型的狀態(tài)),模型就會自動刷新與之相關(guān)的視圖。其新與之相關(guān)的視圖。其UMLUML序列圖可以表示為下圖:序列圖可以表示為下圖:Model類Sphere,必須擴展Observable類,因為在Observable類中,方法addObserver()將視圖與模型相關(guān)聯(lián),當(dāng)模型狀態(tài)改變時,通過方法notifyObservers()通知視圖。其中實現(xiàn)MVC

17、模式的關(guān)鍵代碼為 :import java.util.Observable;class Sphere extends Observable.public void setRadius(double r) myRadius = r; setChanged(); / Indicates that the model has changed notifyObservers(); . View類的角色TextView類必須實現(xiàn)接口Observer,這意味著類TextView必須是implements Observe,另外還需實現(xiàn)其中的方法update()。有了這個方法,當(dāng)模型Sphere類的狀態(tài)發(fā)生改

18、變時,與模型相關(guān)聯(lián)的視圖中的update()方法就會自動被調(diào)用,從而實現(xiàn)視圖的自動刷新。View類的關(guān)鍵代碼如下: import java.util.Observer;import java.util.Observable;public class TextView extends JPanel implements Observer. public void update(Observable o, Object arg) Sphere balloon = (Sphere)o; radiusIn.setText(“ ”+f3.format(balloon.getRadius(); volum

19、eOut.setText(“ ”+f3.format(balloon.volume(); surfAreaOut.setText(“ ” + f3.format(balloon.surfaceArea(); . SphereWindow類作為Controller,它主要新建Model與View,將View與Model相關(guān)聯(lián),并處理事件,其中的關(guān)鍵代碼為: public SphereWindow() super(“Spheres: volume and surface area”); model = new Sphere(0, 0, 100); TextView view = new TextV

20、iew(); model.addObserver(view); view.update(model, null); view.addActionListener(this); Container c = getContentPane(); c.add(view);public void actionPerformed(ActionEvent e) JTextField t = (JTextField)e.getSource(); double r = Double.parseDouble(t.getText(); model.setRadius(r); 擴充一、一個模型、兩個視圖和一個控制器擴

21、充一、一個模型、兩個視圖和一個控制器 當(dāng)用戶在圖形化用戶界面輸入一個球體的半徑,程序除顯示該球體的體積與表面積外,還將圖形化顯示該球體。 其中Model類及View1類根本不需要改變,與前面的完全一樣,這就是面向?qū)ο缶幊痰暮锰?。對于Controller中的SphereWindows類,只需要增加另一個視圖,并與Model發(fā)生關(guān)聯(lián)即可。 一個模型、兩個視圖和兩個控制器一個模型、兩個視圖和兩個控制器 上面的程序只能通過鍵盤輸入球體半徑,現(xiàn)在要求修改程序,利用鼠標放大、縮小右邊的球體圖形來改變球體的半徑,從而獲得球體半徑的輸入。 此時的MCV模式為一個模型、兩個視圖和兩個控制器,其結(jié)構(gòu)為:一個模型、

22、兩個視圖和兩個控制器的一個模型、兩個視圖和兩個控制器的UMLUML類圖類圖 MVC應(yīng)用 struts框架Web Servercreates / reusesindex.htmControllerShowLoggingAction.javaMappingsBusiness Logic LayerData LayerView LayerJsp EngineLoggingBean.javalogging.jspLoggingFormrequest/sessionWeb BrowserGraniteRequest:ShowLogging.docreates form bean in correct s

23、copeperform(mapping, form, request, response)calls business logic ruleto get logging inforeturns forward(success)mainpulates datasetCategoryList(list)forwards logging.jspexpands custom tagsresponse sent to browser pure htmllooks up ServerBean.javapopulates form values . logging.jspMessagesResourcesd

24、isplays internationalized messagesWeb Servercreates / reuses action instancelogging.jspControllerShowLoggingAction.javaMappingsBusiness Logic LayerData LayerView LayerJsp EngineLoggingBean.javaresults.jspLoggingFormrequest/sessionWeb BrowserGraniteform submit action=SaveLogging.doreuses form bean in

25、 correct scopecalls perform(mapping, form, request, response)getCategoryList()returns mapping.findForward(success)forwards result.jspexpands custom tagsDisplays internationalized messages from beanresponse sent to browser pure html looks up ServerBean.javaMessagesBeanadd result messagesauto populates using bean getters/setters becomes request parametercategory0.value added to form usingLoggingForm.getCategory(0).setValue(value)For each one that user has changedcall business logic to change on serverbrowser adds form variables to requestresults.jspif submit, auto populate

溫馨提示

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

評論

0/150

提交評論