設(shè)計(jì)模式-觀察者模式的JDK實(shí)現(xiàn)關(guān)鍵字: 設(shè)計(jì)模式
今天在翻查JAVA API的時(shí)候發(fā)現(xiàn)了特別的類java.util.Observable和接口
java.util.Observer,細(xì)看發(fā)現(xiàn)原來(lái)是java類庫(kù)實(shí)現(xiàn)觀察著(Observer)模式的類和接口。 觀察者模式定義: 觀察者(Observer)模式又名發(fā)布-訂閱(Publish/Subscribe)模式。GOF給觀察者模式如下定義:定義對(duì)象Observer間的一種一對(duì)多的依賴關(guān)系,當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生改變時(shí),所有依賴于它的對(duì)象都得到通知并被自動(dòng)更新。 Observable和Observer的說(shuō)明: 繼承于Observable的子類表示被觀察的對(duì)象,實(shí)現(xiàn)了接口Observer的類表示觀察者.在下面的例子中繼承于Observable的子類 NewsDispatcher(新聞派發(fā)器)表示被觀察的對(duì)象,在有新的新聞的時(shí)候會(huì)把新聞內(nèi)容派發(fā)給所有的訂閱者(Reader),Reader是實(shí)現(xiàn)了Observer接口的類表示讀者。 Observable的簡(jiǎn)單功能介紹: addObserver(Observer o) clearChanged() 清除變化,則把“變化標(biāo)志”設(shè)為false countObservers() 統(tǒng)計(jì)觀察著數(shù)量 deleteObserver(Observer o) 刪除觀察者 deleteObservers() 刪除所有的觀察者 hasChanged() 測(cè)試是否有變化(則返回“變化標(biāo)志”) notifyObservers() 如果hasChanged()=ture,通知所有的觀察著(則調(diào)用Observer.update()方法) notifyObservers(Object arg) 如果hasChanged()=ture,通知所有的觀察著(則調(diào)用Observer.update()方法),并把參數(shù)arg傳過(guò)去 setChanged() 設(shè)置變化,則把“變化標(biāo)志”設(shè)為true Observable的簡(jiǎn)單功能介紹 update(Observable o, Object arg) Observable唯一的方法,在被通知時(shí)被Observable調(diào)用 例子代碼:
package com.pasu.observer; import java.util.Observable; public class NewsDispatcher extends Observable { public void addNews(String news) { this.setChanged(); this.notifyObservers(news); } }
package com.pasu.observer; import java.util.Observable; import java.util.Observer; public class Reader implements Observer { private String name; public Reader(String name) { this.name = name; } @Override public void update(Observable o, Object arg) { String news = (String)arg; System.out.println(name + " : " + news); } }
package com.pasu.observer; public class Test { public static void main(String[] args) { //體育新聞派發(fā)器 NewsDispatcher sportNewsDispatcher = new NewsDispatcher(); //it新聞派發(fā)器 NewsDispatcher itNewsDispatcher = new NewsDispatcher(); //觀察者r1,r2,r3 Reader r1 = new Reader("r1"); Reader r2 = new Reader("r2"); Reader r3 = new Reader("r3"); //添加觀察者 sportNewsDispatcher.addObserver(r1); sportNewsDispatcher.addObserver(r2); itNewsDispatcher.addObserver(r3); //當(dāng)有新的新聞的時(shí)候,通知觀察者 sportNewsDispatcher.addNews("中國(guó)隊(duì)突破了歷史獲得了世界杯冠軍!"); itNewsDispatcher.addNews("ibm 收購(gòu) sun公司,java開(kāi)始收費(fèi)!"); } } Test類運(yùn)行輸出的結(jié)果 |
|