JAVA觀察者模式詳細(xì)介紹及應(yīng)用_第1頁
JAVA觀察者模式詳細(xì)介紹及應(yīng)用_第2頁
JAVA觀察者模式詳細(xì)介紹及應(yīng)用_第3頁
JAVA觀察者模式詳細(xì)介紹及應(yīng)用_第4頁
JAVA觀察者模式詳細(xì)介紹及應(yīng)用_第5頁
已閱讀5頁,還剩1頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、 | HYPERLINK / 百度首頁 HYPERLINK /v2/?login 登錄 HYPERLINK /cashier/browse/vipcashier?dqStatCode=topnav_joinvip&cashier_code=topnav_joinvip VIP意見反饋 HYPERLINK /apps?fr=1011 下載客戶端4/13/2019JAVA觀察者模式詳細(xì)介紹及應(yīng)用 - 百度文庫 HYPERLINK /?fr=nav 首頁 HYPERLINK javascript:void(0); 分類 HYPERLINK javascript:void(0); 精品內(nèi)容 HYPER

2、LINK /wenkuverify?from=1 申請認(rèn)證 HYPERLINK javascript:void(0); 機(jī)構(gòu)合作 HYPERLINK javascript:void(0); 頻道專區(qū) HYPERLINK /xtopic/wkback 百度智慧課堂 HYPERLINK /user/browse/vip/ 百度教育VIP HYPERLINK /?fr=crumbs 百度文庫 HYPERLINK /?fr=crumbs HYPERLINK /pro/index 專業(yè)資料 HYPERLINK /pro/index HYPERLINK /list/230 工程科技 HYPERLINK /

3、list/230 HYPERLINK /list/154 電子/電路Java 的設(shè)計(jì)模式很多,觀察者模式被稱為是模式中的皇后,而且 Java jdk 也對它做了實(shí)現(xiàn),可見該設(shè)計(jì)模式的重要位置。在圖形化設(shè)計(jì)的軟件中,為了實(shí)現(xiàn)視圖和事件處理的分離,大多都采用了 Observer 模式,比如 Java 的 Swing,F(xiàn)lex 的 ActionScript等。在現(xiàn)實(shí)的應(yīng)用系統(tǒng)中也有好多應(yīng)用,比如像當(dāng)當(dāng)網(wǎng)、京東商城一類的電子商務(wù)網(wǎng)站,如果你對某件商品比較關(guān)注,可以放到收藏架,那么當(dāng)該商品降價(jià)時(shí),系統(tǒng)給您發(fā)送手機(jī)短信或郵件。這就是觀察者模式的一個(gè)典型應(yīng)用,商品是被觀察者,有的叫主體;關(guān)注該商品的客戶就是

4、觀察者。下面的一個(gè)事例將模擬這個(gè)應(yīng)用。GoF 說道:Observer 模式的意圖是“定義對象間的一種一對多的依賴關(guān)系,當(dāng)一個(gè)對象的狀態(tài)發(fā)生改變時(shí),所有依賴于它的對象都得到通知并被自動(dòng)更新 ”。從這段話里我們可以得到兩個(gè)信息,如下:1, 觀察者(具體執(zhí)行操作的對象,有多個(gè))2, 被觀察者(顧名思義是被觀察的對象,如果該對象發(fā)生某些變化則通知觀察者執(zhí)行對應(yīng)的操)jdk在 java 的 util 包中實(shí)現(xiàn)了該設(shè)計(jì)模式的框架,大部分應(yīng)用都可以直接用它,當(dāng)然了你也可以自己實(shí)現(xiàn)它,實(shí)際上就是一個(gè)被觀察者的抽象類和一個(gè)觀察者接口。我們先看一下 jdk 是如何實(shí)現(xiàn)的。被觀察者的抽象類 java.util.Ob

5、servablepackage java.util;public class Observable private boolean changed = false;private Vector obs;/創(chuàng)建被觀察者時(shí)就創(chuàng)建一個(gè)它持有的觀察者列表,注意,這個(gè)列表是需要同步的。public Observable() obs = new Vector();/* 添加觀察者到觀察者列表中去*/public synchronized void addObserver(Observer o) if (o = null)throw new NullPointerException();if (!obs.c

6、ontains(o) obs.addElement(o);/* 刪除一個(gè)觀察者*/view/0a2e3d14cd1755270722192e453610661ed95ab3.html1/6 4/13/2019JAVA觀察者模式詳細(xì)介紹及應(yīng)用 - 百度文庫public synchronized void deleteObserver(Observer o) obs.removeElement(o);public void notifyObservers() notifyObservers(null);/* 通知操作,即被觀察者發(fā)生變化,通知對應(yīng)的觀察者進(jìn)行事先設(shè)定的操作 ,這個(gè)方法接受一個(gè)參數(shù),

7、這個(gè)參數(shù)一直傳到觀察者里,以供觀察者使用*/public void notifyObservers(Object arg) Object arrLocal;synchronized (this) if (!changed)return;arrLocal = obs.toArray();clearChanged();for (int i = arrLocal.length-1; i=0; i-)(Observer)arrLocali).update(this, arg);public synchronized void deleteObservers() obs.removeAllElement

8、s();protected synchronized void setChanged() changed = true;protected synchronized void clearChanged() changed = false;public synchronized boolean hasChanged() return changed;public synchronized int countObservers() return obs.size();當(dāng)我們自己的被觀察者繼承這個(gè) Observable 類是,我們就自動(dòng)的獲取到被觀察者的一切條件了。很方便是不是,這也是為什么 sun

9、 要把 Observable 放到 java.util 包中的原因,就是為了方便開發(fā)者。下面我們再看一下觀察者的接口 java.util.Observerpackage java.util;public interface Observer /view/0a2e3d14cd1755270722192e453610661ed95ab3.html2/6 4/13/2019JAVA觀察者模式詳細(xì)介紹及應(yīng)用 - 百度文庫void update(Observable o, Object arg);接口中就只有一個(gè)方法,update,方法中有兩個(gè)參數(shù),Observable 和一個(gè) object,第一個(gè)參數(shù)

10、就是被觀察的對象,而第二個(gè)參數(shù)就得看業(yè)務(wù)需求了,需要什么就傳進(jìn)去什么。我們自己的觀察者類必須實(shí)現(xiàn)這個(gè)方法,這樣在被觀察者調(diào)用 notifyObservers 操作時(shí)被觀察者所持有的所有觀察者都會(huì)執(zhí)行 update 操作了.下面是一個(gè) book 對象,它是一個(gè)被觀察者,所以要繼承 Observable。import java.util.Observable;public class Book extends Observable private String name = ;private double price = 0.0;public String getName() return nam

11、e;public void setName(String name) = name;public double getPrice() return price;public void setPrice(double price) this.price = price;/當(dāng)書的價(jià)格修改時(shí)調(diào)用該方法public void modifyPrice(Book b) /調(diào)用父類的方法,改變被觀察者的狀態(tài)setChanged();/通知客戶該書已降價(jià)notifyObservers(b);下面是觀察者對象,表示顧客的電子郵件,它實(shí)現(xiàn)了 Observer 接口。import java.util.Observa

12、ble;import java.util.Observer;public class BuyerEmail implements Observer /view/0a2e3d14cd1755270722192e453610661ed95ab3.html3/6 4/13/2019JAVA觀察者模式詳細(xì)介紹及應(yīng)用 - 百度文庫private String buyerId = ;private String email = ;public String getBuyerId() return buyerId;public void setBuyerId(String buyerId) this.buy

13、erId = buyerId;public String getEmail() return email;public void setEmail(String email) this.email = email;/該方法會(huì)被“被觀察者的父類”既 Observable 調(diào)用public void update(Observable o, Object arg) /這里做具體發(fā)電子郵件的操作Book b = (Book)arg;System.out.println(給顧客的發(fā)電子郵件:+b.getName()+降價(jià)了,目前價(jià)格為:+b.getPrice();下面是另一個(gè)觀察者對象,表示顧客的手機(jī)

14、,同樣需要繼承 Observer 接口import java.util.Observable;import java.util.Observer;public class BuyerMobileMessage implements Observer private String buyerId = ;private String mobileNo = ;public String getBuyerId() return buyerId;public void setBuyerId(String buyerId) this.buyerId = buyerId;public String getM

15、obileNo() return mobileNo;public void setMobileNo(String mobileNo) this.mobileNo = mobileNo;public void update(Observable o, Object arg) /view/0a2e3d14cd1755270722192e453610661ed95ab3.html4/6 4/13/2019JAVA觀察者模式詳細(xì)介紹及應(yīng)用 - 百度文庫/ TODO Auto-generated method stubBook b = (Book)arg;System.out.println(給顧客的發(fā)

16、手機(jī)短信:+b.getName()+降價(jià)了,目前價(jià)格為:+b.getPrice();下面是調(diào)用類:public class MainApp public static void main(String args)Book b1 = new Book();b1.setName();b1.setPrice(45.00);/假設(shè)原價(jià)是 60,現(xiàn)在是降價(jià)促銷/下面的觀察者在實(shí)際的應(yīng)用中可以從數(shù)據(jù)庫或文件中讀取BuyerMobileMessage bm = new BuyerMobileMessage();bm.setBuyerId(001);bm.setMobileNo(138*);BuyerEmail be = new BuyerEmail();be.setBuyerId(001);be.setEmail();/增加觀察者,在實(shí)際應(yīng)用中就是那些人對該書做了關(guān)注b1.addObserver(bm);b1.addObserver(be);b1.modifyPrice(b1);輸出:給顧客的發(fā)電子郵件:降價(jià)了,目前價(jià)格為:45.0給顧客的發(fā)手機(jī)短信:降價(jià)了,目前價(jià)格為:45.0不知道上面的例子你看懂了沒有,觀察者模式實(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

提交評論