
? 我們這里簡單用代碼描述如下:
- package ?observer.desc;??
- /** ?
- ?*? ?
- ?*作者:alaric ?
- ?*時間:2013-8-13下午8:05:08 ?
- ?*描述:抽象觀察者 ?
- ?*/ ??
- public ? interface ?Observer?{??
- ??????
- ???? public ? void ?update();??
- ??????
- }??
- package ?observer.desc;??
- /** ?
- ?*? ?
- ?*作者:alaric ?
- ?*時間:2013-8-13下午8:05:34 ?
- ?*描述:具體觀察者 ?
- ?*/ ??
- public ? class ?ConcreteObserver? implements ?Observer{??
- ??
- ???? @Override ??
- ???? public ? void ?update()?{??
- ???????? //?寫業(yè)務(wù)邏輯 ??
- ????}??
- ??
- }??
- package ?observer.desc;??
- /** ?
- ?*? ?
- ?*作者:alaric ?
- ?*時間:2013-8-13下午8:05:55 ?
- ?*描述:抽象主題 ?
- ?*/ ??
- public ? interface ?Subject?{??
- ??
- ???? public ? void ?attach(Observer?observer);??
- ??
- ???? public ? void ?detach(Observer?observer);??
- ??
- ???? void ?notifyObservers();??
- }??
- package ?observer.desc;??
- ??
- import ?java.util.Enumeration;??
- import ?java.util.Vector;??
- /** ?
- ?*? ?
- ?*作者:alaric ?
- ?*時間:2013-8-13下午8:09:21 ?
- ?*描述:具體主題類 ?
- ?*/ ??
- public ? class ?ConcreteSubject? implements ?Subject?{??
- ???? private ?Vector<Observer>observersVector?=? new ?Vector<Observer>();??
- ???? public ? void ?attach(Observer?observer)?{??
- ????????observersVector.addElement(observer);??
- ????}??
- ??
- ???? public ? void ?detach(Observer?observer)?{??
- ????????observersVector.removeElement(observer);??
- ????}??
- ??
- ???? public ? void ?notifyObservers()?{??
- ????????Enumeration<Observer>enumeration?=?observers();??
- ???????? while ?(enumeration.hasMoreElements())?{??
- ????????????((Observer)?enumeration.nextElement()).update();??
- ????????}??
- ????}??
- ??
- ???? @SuppressWarnings ( "unchecked" )??
- ???? public ?Enumeration<Observer>?observers()?{??
- ???????? return ?((Vector<Observer>)?observersVector.clone()).elements();??
- ????}??
- ??
- }???
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)
?
- package ?observer;??
- ??
- import ?java.util.List;??
- import ?java.util.Observable;??
- import ?java.util.Observer;??
- /** ?
- ?*? ?
- ?*作者:alaric ?
- ?*時間:2013-8-13下午9:32:40 ?
- ?*描述:警察張三 ?
- ?*/ ??
- public ? class ?Police? extends ?Observable?{??
- ??
- ???? private ?String?time?;??
- ???? public ?Police(List<Observer>?list)?{??
- ???????? super ();??
- ???????? for ?(Observer?o:list)?{??
- ????????????addObserver(o);??
- ????????}??
- ????}??
- ???? public ? void ?change(String?time){??
- ???????? this .time?=?time;??
- ????????setChanged();??
- ????????notifyObservers( this .time);??
- ????}??
- }??
- package ?observer;??
- ??
- import ?java.util.Observable;??
- import ?java.util.Observer;??
- /** ?
- ?*? ?
- ?*作者:alaric ?
- ?*時間:2013-8-13下午9:32:59 ?
- ?*描述:臥底A ?
- ?*/ ??
- public ? class ?UndercoverA? implements ?Observer?{??
- ??
- ???? private ?String?time;??
- ???? @Override ??
- ???? public ? void ?update(Observable?o,?Object?arg)?{??
- ????????time?=?(String)?arg;??
- ????????System.out.println( "臥底A接到消息,行動時間為:" +time);??
- ????}??
- ??
- ??
- }??
- package ?observer;??
- ??
- import ?java.util.Observable;??
- import ?java.util.Observer;??
- /** ?
- ?*? ?
- ?*作者:alaric ?
- ?*時間:2013-8-13下午9:33:14 ?
- ?*描述:臥底B ?
- ?*/ ??
- public ? class ?UndercoverB? implements ?Observer?{??
- ???? private ?String?time;??
- ???? @Override ??
- ???? public ? void ?update(Observable?o,?Object?arg)?{??
- ????????time?=?(String)?arg;??
- ????????System.out.println( "臥底B接到消息,行動時間為:" +time);??
- ????}??
- ??
- ??
- ??
- }??
- package ?observer;??
- ??
- import ?java.util.ArrayList;??
- import ?java.util.List;??
- import ?java.util.Observer;??
- /** ?
- ?*? ?
- ?*作者:alaric ?
- ?*時間:2013-8-13下午9:32:26 ?
- ?*描述:測試 ?
- ?*/ ??
- public ? class ?Client?{??
- ??
- ???? /** ?
- ?????*?@param?args ?
- ?????*/ ??
- ???? public ? static ? void ?main(String[]?args)?{??
- ????????UndercoverA?o1?=? new ?UndercoverA();??
- ????????UndercoverB?o2?=? new ?UndercoverB();??
- ????????List<Observer>?list?=? new ?ArrayList<>();??
- ????????list.add(o1);??
- ????????list.add(o2);??
- ????????Police?subject?=? new ?Police(list);??
- ????????subject.change( "02:25" );??
- ????????System.out.println( "===========由于消息敗露,行動時間提前=========" );??
- ????????subject.change( "01:05" );??
- ??????????
- ????}??
- ??
- }??
?測試運行結(jié)果:
臥底B接到消息,行動時間為:02:25
臥底A接到消息,行動時間為:02:25
===========由于消息敗露,行動時間提前=========
臥底B接到消息,行動時間為:01:05
臥底A接到消息,行動時間為:01:05
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

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