欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

觀察者模式

系統 2380 0
觀察者(Observer)模式 :是對象的行為模式,又叫做發布-訂閱(Publish/Subscribe)模式、模型-視圖(Model/View)模式、源-監聽(Source/Listener)模式或者從屬(Dependents)模式。觀察者模式定義了一種一對多的依賴關系,讓多個觀察者對象同時監聽某一個主題對象,這個主題對象在狀態上發生變化時,會通知所有觀察者對象,使它們能夠自動更新自己。
觀察者模式類的結構:
觀察者模式角色如下:
抽象主題(Subject)角色 :抽象主題角色提供維護一個觀察者對象聚集的操作方法,對聚集的增加、刪除等。
具體主題(ConcreteSubject)角色 :將有關狀態存入具體的觀察者對象;在具體主題的內部狀態改變時,給所有登記過的觀察者發出通知。具體主題角色負責實現抽象主題中聚集的管理方法。
抽象觀察者(Observer)角色 :為具體觀察者提供一個更新接口。
具體觀察者(ConcreteObserver)角色 :存儲與主題相關的自洽狀態,實現抽象觀察者提供的更新接口。
?
仔細觀察上面的類圖,發現具體主題角色和抽象觀察者之間的連線,是因為具體主題角色維護了一個觀察者引用的聚集,如果有多個具體主題角色,意味著每個具體角色都要維護一個觀察者的聚集,那么能不能將聚集提升到抽象主題里面呢?這個就需要考慮場景,如果多個主題實現在管理上都有很大差異,那么就不能提升到抽象角色中,但是絕大多數情況下,這些聚集管理方法本身就是所有具體主題所共有的,所以大多數情況下都是可以將聚集和聚集的管理都移入到抽象主題中的,因為notifyObserver()方法是依賴于聚集的,所以將notifyObserver()也移入抽象主題中,這樣就形成了如下的另一種觀察者模式結構:
觀察者模式
? 我們這里簡單用代碼描述如下:
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. ???????? //?寫業務邏輯 ??
  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. }???
上面代碼描述第一種形式,第二種讀者可以自己實現,這里不再贅述。
接下來我們看java語言是如何支持觀察者模式的,java提供一個被觀察者類java.util.Observable和一個觀察者接口java.util.Observer。

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

public interface Observer

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

從以下版本開始:

JDK1.0

另請參見:

Observable

?

public class Observableextends Object

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

一個 observable 對象可以有一個或多個觀察者。觀察者可以是實現了 Observer 接口的任意對象。一個 observable 實例改變后,調用 Observable 的 notifyObservers 方法的應用程序會通過調用觀察者的 update 方法來通知觀察者該實例發生了改變。

?

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

?

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

?

從以下版本開始:

JDK1.0

另請參見:?

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

?

舉個例子,如果你看過TVB的警匪片,你就知道臥底的工作方式。一般一個警察可能有幾個臥底,潛入敵人內部,打探消息,臥底完全靠他的領導的指示干活,領導說幾點行動,他必須按照這個時間去執行,如果行動時間改變,他也要立馬改變自己配合行動的時間。領導派兩個臥底去打入敵人內部,那么領導相當于抽象主題,而督察警官張三這個人派了兩個臥底李四和萬王五,張三就相當于具體主題,臥底相當于抽象觀察者,這兩名臥底是李四和王五就是具體觀察者,派的這個動作相當于觀察者在主題的登記。那么這個類圖如下:
利用javaAPI來實現,代碼描述如下: ?
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. }??

?測試運行結果:

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

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

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

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

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

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

觀察者模式


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

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

【本文對您有幫助就好】

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

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 欧美日韩在线一区 | 三级在线国产 | 欧美一级欧美三级在线观看 | 久久久视频在线 | 亚洲日本乱码在线观看 | 国产欧美一区二区视频 | 色婷婷精品国产一区二区三区 | 欧美成视频无需播放器 | 久久九九99热这里只有精品 | 亚洲精品成人AA片在线播 | 午夜精品视频在线观看 | 欧美a∨ | 午夜小视频免费观看 | 日韩亚洲欧美视频 | 青青色在线观看 | 国产日本三级欧美三级妇三级四 | 777色狠狠一区二区三区香蕉 | 亚洲欧美日韩国产精品26u | 精品国产欧美一区二区 | 99色吧| 精品视频导航 | 福利视频1000| 国产精品高清在线 | 国产高清免费视频 | 99热久久这里只有精品6国产网 | 久久精品一 | 国产精品蜜臂在线观看 | 色噜噜狠狠大色综合 | 99久久精品费精品国产一区二区 | 少妇特黄A片一区二区三区免费看 | 嫩草嫩草嫩草 | 久久青草国产免费观看 | 奇米影视首页 | 狠狠躁日日躁夜夜躁A片小说按摩 | 艹逼视频网 | 国产精品日韩欧美在线第3页 | 在线观看黄色小视频 | 午夜视频在线 | 天天夜夜骑 | 色www精品视频在线观看 | 久草手机视频在线观看 |