設(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開始收費(fèi)!");
}
}
Test類運(yùn)行輸出的結(jié)果 |
|
|