亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

觀察者模式

系統(tǒng) 2305 0
觀察者(Observer)模式 :是對象的行為模式,又叫做發(fā)布-訂閱(Publish/Subscribe)模式、模型-視圖(Model/View)模式、源-監(jiān)聽(Source/Listener)模式或者從屬(Dependents)模式。觀察者模式定義了一種一對多的依賴關(guān)系,讓多個觀察者對象同時監(jiān)聽某一個主題對象,這個主題對象在狀態(tài)上發(fā)生變化時,會通知所有觀察者對象,使它們能夠自動更新自己。
觀察者模式類的結(jié)構(gòu):
觀察者模式角色如下:
抽象主題(Subject)角色 :抽象主題角色提供維護一個觀察者對象聚集的操作方法,對聚集的增加、刪除等。
具體主題(ConcreteSubject)角色 :將有關(guān)狀態(tài)存入具體的觀察者對象;在具體主題的內(nèi)部狀態(tài)改變時,給所有登記過的觀察者發(fā)出通知。具體主題角色負(fù)責(zé)實現(xiàn)抽象主題中聚集的管理方法。
抽象觀察者(Observer)角色 :為具體觀察者提供一個更新接口。
具體觀察者(ConcreteObserver)角色 :存儲與主題相關(guān)的自洽狀態(tài),實現(xiàn)抽象觀察者提供的更新接口。
?
仔細(xì)觀察上面的類圖,發(fā)現(xiàn)具體主題角色和抽象觀察者之間的連線,是因為具體主題角色維護了一個觀察者引用的聚集,如果有多個具體主題角色,意味著每個具體角色都要維護一個觀察者的聚集,那么能不能將聚集提升到抽象主題里面呢?這個就需要考慮場景,如果多個主題實現(xiàn)在管理上都有很大差異,那么就不能提升到抽象角色中,但是絕大多數(shù)情況下,這些聚集管理方法本身就是所有具體主題所共有的,所以大多數(shù)情況下都是可以將聚集和聚集的管理都移入到抽象主題中的,因為notifyObserver()方法是依賴于聚集的,所以將notifyObserver()也移入抽象主題中,這樣就形成了如下的另一種觀察者模式結(jié)構(gòu):
觀察者模式
? 我們這里簡單用代碼描述如下:
Java代碼?? 收藏代碼
  1. package ?observer.desc;??
  2. /** ?
  3. ?*? ?
  4. ?*作者:alaric ?
  5. ?*時間:2013-8-13下午8:05:08 ?
  6. ?*描述:抽象觀察者 ?
  7. ?*/ ??
  8. public ? interface ?Observer?{??
  9. ??????
  10. ???? public ? void ?update();??
  11. ??????
  12. }??
?
Java代碼?? 收藏代碼
  1. package ?observer.desc;??
  2. /** ?
  3. ?*? ?
  4. ?*作者:alaric ?
  5. ?*時間:2013-8-13下午8:05:34 ?
  6. ?*描述:具體觀察者 ?
  7. ?*/ ??
  8. public ? class ?ConcreteObserver? implements ?Observer{??
  9. ??
  10. ???? @Override ??
  11. ???? public ? void ?update()?{??
  12. ???????? //?寫業(yè)務(wù)邏輯 ??
  13. ????}??
  14. ??
  15. }??
?
Java代碼?? 收藏代碼
  1. package ?observer.desc;??
  2. /** ?
  3. ?*? ?
  4. ?*作者:alaric ?
  5. ?*時間:2013-8-13下午8:05:55 ?
  6. ?*描述:抽象主題 ?
  7. ?*/ ??
  8. public ? interface ?Subject?{??
  9. ??
  10. ???? public ? void ?attach(Observer?observer);??
  11. ??
  12. ???? public ? void ?detach(Observer?observer);??
  13. ??
  14. ???? void ?notifyObservers();??
  15. }??
?
Java代碼?? 收藏代碼
  1. package ?observer.desc;??
  2. ??
  3. import ?java.util.Enumeration;??
  4. import ?java.util.Vector;??
  5. /** ?
  6. ?*? ?
  7. ?*作者:alaric ?
  8. ?*時間:2013-8-13下午8:09:21 ?
  9. ?*描述:具體主題類 ?
  10. ?*/ ??
  11. public ? class ?ConcreteSubject? implements ?Subject?{??
  12. ???? private ?Vector<Observer>observersVector?=? new ?Vector<Observer>();??
  13. ???? public ? void ?attach(Observer?observer)?{??
  14. ????????observersVector.addElement(observer);??
  15. ????}??
  16. ??
  17. ???? public ? void ?detach(Observer?observer)?{??
  18. ????????observersVector.removeElement(observer);??
  19. ????}??
  20. ??
  21. ???? public ? void ?notifyObservers()?{??
  22. ????????Enumeration<Observer>enumeration?=?observers();??
  23. ???????? while ?(enumeration.hasMoreElements())?{??
  24. ????????????((Observer)?enumeration.nextElement()).update();??
  25. ????????}??
  26. ????}??
  27. ??
  28. ???? @SuppressWarnings ( "unchecked" )??
  29. ???? public ?Enumeration<Observer>?observers()?{??
  30. ???????? return ?((Vector<Observer>)?observersVector.clone()).elements();??
  31. ????}??
  32. ??
  33. }???
上面代碼描述第一種形式,第二種讀者可以自己實現(xiàn),這里不再贅述。
接下來我們看java語言是如何支持觀察者模式的,java提供一個被觀察者類java.util.Observable和一個觀察者接口java.util.Observer。

jdk1.6中API文檔如下描述:

public interface Observer

一個可在觀察者要得到 observable 對象更改通知時可實現(xiàn) Observer 接口的類。

從以下版本開始:

JDK1.0

另請參見:

Observable

?

public class Observableextends Object

此類表示模型視圖范例中的 observable 對象,或者說“數(shù)據(jù)”。可將其子類化,表示應(yīng)用程序想要觀察的對象。

一個 observable 對象可以有一個或多個觀察者。觀察者可以是實現(xiàn)了 Observer 接口的任意對象。一個 observable 實例改變后,調(diào)用 Observable 的 notifyObservers 方法的應(yīng)用程序會通過調(diào)用觀察者的 update 方法來通知觀察者該實例發(fā)生了改變。

?

未指定發(fā)送通知的順序。Observable 類中所提供的默認(rèn)實現(xiàn)將按照其注冊的重要性順序來通知 Observers,但是子類可能改變此順序,從而使用非固定順序在單獨的線程上發(fā)送通知,或者也可能保證其子類遵從其所選擇的順序。

?

注意,此通知機制與線程無關(guān),并且與 Object 類的 wait 和 notify 機制完全獨立。 新創(chuàng)建一個 observable 對象時,其觀察者集是空的。當(dāng)且僅當(dāng) equals 方法為兩個觀察者返回 true 時,才認(rèn)為它們是相同的。

?

從以下版本開始:

JDK1.0

另請參見:?

notifyObservers(), notifyObservers(java.lang.Object), Observer, Observer.update(java.util.Observable, java.lang.Object)

?

舉個例子,如果你看過TVB的警匪片,你就知道臥底的工作方式。一般一個警察可能有幾個臥底,潛入敵人內(nèi)部,打探消息,臥底完全靠他的領(lǐng)導(dǎo)的指示干活,領(lǐng)導(dǎo)說幾點行動,他必須按照這個時間去執(zhí)行,如果行動時間改變,他也要立馬改變自己配合行動的時間。領(lǐng)導(dǎo)派兩個臥底去打入敵人內(nèi)部,那么領(lǐng)導(dǎo)相當(dāng)于抽象主題,而督察警官張三這個人派了兩個臥底李四和萬王五,張三就相當(dāng)于具體主題,臥底相當(dāng)于抽象觀察者,這兩名臥底是李四和王五就是具體觀察者,派的這個動作相當(dāng)于觀察者在主題的登記。那么這個類圖如下:
利用javaAPI來實現(xiàn),代碼描述如下: ?
Java代碼?? 收藏代碼
  1. package ?observer;??
  2. ??
  3. import ?java.util.List;??
  4. import ?java.util.Observable;??
  5. import ?java.util.Observer;??
  6. /** ?
  7. ?*? ?
  8. ?*作者:alaric ?
  9. ?*時間:2013-8-13下午9:32:40 ?
  10. ?*描述:警察張三 ?
  11. ?*/ ??
  12. public ? class ?Police? extends ?Observable?{??
  13. ??
  14. ???? private ?String?time?;??
  15. ???? public ?Police(List<Observer>?list)?{??
  16. ???????? super ();??
  17. ???????? for ?(Observer?o:list)?{??
  18. ????????????addObserver(o);??
  19. ????????}??
  20. ????}??
  21. ???? public ? void ?change(String?time){??
  22. ???????? this .time?=?time;??
  23. ????????setChanged();??
  24. ????????notifyObservers( this .time);??
  25. ????}??
  26. }??
?
Java代碼?? 收藏代碼
  1. package ?observer;??
  2. ??
  3. import ?java.util.Observable;??
  4. import ?java.util.Observer;??
  5. /** ?
  6. ?*? ?
  7. ?*作者:alaric ?
  8. ?*時間:2013-8-13下午9:32:59 ?
  9. ?*描述:臥底A ?
  10. ?*/ ??
  11. public ? class ?UndercoverA? implements ?Observer?{??
  12. ??
  13. ???? private ?String?time;??
  14. ???? @Override ??
  15. ???? public ? void ?update(Observable?o,?Object?arg)?{??
  16. ????????time?=?(String)?arg;??
  17. ????????System.out.println( "臥底A接到消息,行動時間為:" +time);??
  18. ????}??
  19. ??
  20. ??
  21. }??
?
Java代碼?? 收藏代碼
  1. package ?observer;??
  2. ??
  3. import ?java.util.Observable;??
  4. import ?java.util.Observer;??
  5. /** ?
  6. ?*? ?
  7. ?*作者:alaric ?
  8. ?*時間:2013-8-13下午9:33:14 ?
  9. ?*描述:臥底B ?
  10. ?*/ ??
  11. public ? class ?UndercoverB? implements ?Observer?{??
  12. ???? private ?String?time;??
  13. ???? @Override ??
  14. ???? public ? void ?update(Observable?o,?Object?arg)?{??
  15. ????????time?=?(String)?arg;??
  16. ????????System.out.println( "臥底B接到消息,行動時間為:" +time);??
  17. ????}??
  18. ??
  19. ??
  20. ??
  21. }??
?
Java代碼?? 收藏代碼
  1. package ?observer;??
  2. ??
  3. import ?java.util.ArrayList;??
  4. import ?java.util.List;??
  5. import ?java.util.Observer;??
  6. /** ?
  7. ?*? ?
  8. ?*作者:alaric ?
  9. ?*時間:2013-8-13下午9:32:26 ?
  10. ?*描述:測試 ?
  11. ?*/ ??
  12. public ? class ?Client?{??
  13. ??
  14. ???? /** ?
  15. ?????*?@param?args ?
  16. ?????*/ ??
  17. ???? public ? static ? void ?main(String[]?args)?{??
  18. ????????UndercoverA?o1?=? new ?UndercoverA();??
  19. ????????UndercoverB?o2?=? new ?UndercoverB();??
  20. ????????List<Observer>?list?=? new ?ArrayList<>();??
  21. ????????list.add(o1);??
  22. ????????list.add(o2);??
  23. ????????Police?subject?=? new ?Police(list);??
  24. ????????subject.change( "02:25" );??
  25. ????????System.out.println( "===========由于消息敗露,行動時間提前=========" );??
  26. ????????subject.change( "01:05" );??
  27. ??????????
  28. ????}??
  29. ??
  30. }??

?測試運行結(jié)果:

臥底B接到消息,行動時間為:02:25

臥底A接到消息,行動時間為:02:25

===========由于消息敗露,行動時間提前=========

臥底B接到消息,行動時間為:01:05

臥底A接到消息,行動時間為:01:05

觀察者模式的優(yōu)點是只要訂閱/登記了之后,當(dāng)被觀察者改變時,觀察者能自動更新。跟JMS一樣,消息發(fā)布者發(fā)出消息時,只要注冊過的都會收到消息。

觀察者模式


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 亚洲国产成人在线视频 | 久久中文视频 | 久久免费观看国产精品 | 久久精品亚洲一区二区三区浴池 | 奇米影视亚洲春色 | 国产精品视频免费视频 | 中文字幕日韩在线 | 天天操天天干天天 | 久久无码精品一区二区三区 | 日韩天天摸天天澡天天爽视频 | 91视频免费看 | 亚洲一级毛片在线观 | 久久综合九色综合狠狠97 | 中文字幕国产综合 | 精品免费久久久久久成人影院 | 国产精品久久久久久久久齐齐 | 狠狠狠色丁香婷婷综合久久88 | 国产成人一区二区在线不卡 | 国产乱在线观看视频 | 伊人伊网 | 久久久久毛片免费观看 | 99爱视频在线观看 | 又黄又爽又成人免费视频 | 天天干夜夜做 | 特级无码a级毛片特黄 | 亚洲视频大全 | 国产一区二区三区免费视频 | 亚洲欧美日韩中文字幕在线 | 亚洲欧洲国产精品 | 国产精品免费看久久久香蕉 | 久久久综合| 亚洲欧美成人 | 青青青国产观看免费视频 | 成人91视频 | 日韩一区二区三区在线免费观看 | 亚洲国产精品综合福利专区 | 在线日韩国产 | 国产成人精品999在线 | 亚洲成年网站 | 奇米一区| 在线观看欧美一区 |