java观察者_Java中的观察者模式
讓一個(gè)類能夠被觀察,則該類需要繼承java.util.Observable類。
要讓一個(gè)類成為觀察者,則該類需要實(shí)現(xiàn)java.util.Observable接口。
讓觀察者和被觀察者建立聯(lián)系通過(guò)Observable的addObserver(Object obj)方法。
讓被觀察者通知觀察者,通過(guò)Observable類中的setChanged()和notifyObservers(Object obj)方法。
下面的例子定義了一個(gè)售房中心類和一個(gè)賣(mài)家類。售房中心為被觀察者,買(mǎi)房者為觀察者。售房中心房?jī)r(jià)發(fā)生變化,則將相應(yīng)的信息通知買(mǎi)房者。
代碼如下:
import java.util.*;class HouseSellCenter extendsObservable
{publicString name;public floatprice;public HouseSellCenter(String name, floatprice)
{this.name =name;this.price =price;
}public void changePrice(floatprice)
{this.price =price;super.setChanged();super.notifyObservers(price);
}publicString toString()
{return "name:" + this.name + " price:" +this.price;
}
}class Buyer implementsObserver
{publicString name;publicBuyer(String name)
{this.name =name;
}public voidupdate(Observable o, Object arg)
{
HouseSellCenter hsc=(HouseSellCenter)o;
System.out.println(this.name+"觀察到:"+hsc.name+"房?jī)r(jià)變?yōu)?" + arg + "萬(wàn)");
}
}classHello
{public static voidmain(String[] args)
{
HouseSellCenter hsc= new HouseSellCenter("金悅城",1.3f);
Buyer buyer1= new Buyer("金旭地產(chǎn)");
Buyer buyer2= new Buyer("龍城中介");
Buyer buyer3= new Buyer("祥龍置業(yè)");
hsc.addObserver(buyer1);
hsc.addObserver(buyer2);
hsc.addObserver(buyer3);
System.out.println("============");
hsc.changePrice(1.5f);
System.out.println("============");
sleep(3000);
System.out.println("============");
hsc.changePrice(1.2f);
System.out.println("============");
}public static void sleep(inttimeSpan)
{try{
Thread.sleep(timeSpan);
}catch(Exception e)
{
System.out.println(e);
}
}
}
輸出結(jié)果:
============祥龍置業(yè)觀察到:金悅城房?jī)r(jià)變?yōu)?1.5萬(wàn)
龍城中介觀察到:金悅城房?jī)r(jià)變?yōu)?1.5萬(wàn)
金旭地產(chǎn)觀察到:金悅城房?jī)r(jià)變?yōu)?1.5萬(wàn)============
============祥龍置業(yè)觀察到:金悅城房?jī)r(jià)變?yōu)?1.2萬(wàn)
龍城中介觀察到:金悅城房?jī)r(jià)變?yōu)?1.2萬(wàn)
金旭地產(chǎn)觀察到:金悅城房?jī)r(jià)變?yōu)?1.2萬(wàn)============
上面的代碼是利用了Java對(duì)觀察者模式的支持。下面用另一個(gè)例子說(shuō)明觀察者模式運(yùn)行規(guī)則。
Observerable接口(定義被觀察者的規(guī)范):
public interfaceObserverable
{voidaddObserver(ObserverBehavior newObserver);voidremoveObserver(ObserverBehavior observerToBeRemoved);voidnotifyAllObservers();
}
ObserverBehavior接口(定義觀察者的規(guī)范):
public interfaceObserverBehavior
{void update(float temperature, float humidity, floatpressure);
}
WeatherData類實(shí)現(xiàn)Observerable接口,其是真實(shí)的被觀察者類:
importjava.util.List;importjava.util.ArrayList;public class WeatherData implementsObserverable
{private ListobserverList;private floattemperature;private floathumidity;private floatpressure;publicWeatherData()
{this.observerList = new ArrayList();
}
@Overridepublic voidaddObserver(ObserverBehavior newObserver)
{//TODO Auto-generated method stub
this.observerList.add(newObserver);
}
@Overridepublic voidnotifyAllObservers()
{//TODO Auto-generated method stub
for(ObserverBehavior observer : this.observerList)
{
observer.update(this.temperature, this.humidity, this.pressure);
}
}
@Overridepublic voidremoveObserver(ObserverBehavior observerToBeRemoved)
{//TODO Auto-generated method stub
this.observerList.remove(observerToBeRemoved);
}public void weatherChanged(float temperature, float humidity, floatpressure)
{this.temperature =temperature;this.humidity =humidity;this.pressure =pressure;this.notifyAllObservers();
}
}
MobileDevices實(shí)現(xiàn)ObserverBehavior類(真正的觀察者):
public class MobileDevices implementsObserverBehavior
{privateString name;publicMobileDevices(String name)
{this.name =name;
}
@Overridepublic void update(float temperature, float humidity, floatpressure)
{//TODO Auto-generated method stub
System.out.println(this.name + "觀察到當(dāng)前 --> 溫度:" + temperature + " 濕度:" + humidity + " 氣壓:" +pressure);
}
@Overridepublic booleanequals(Object obj)
{if(this ==obj)return true;if(!(obj instanceofMobileDevices))return false;
MobileDevices otherOne=(MobileDevices)obj;if(this.name.equals(otherOne.name))return true;else
return false;
}
}
WhiteBoard實(shí)現(xiàn)了ObserverBehavior類(另一個(gè)真正的觀察者):
public class WhiteBoard implementsObserverBehavior
{privateString name;publicWhiteBoard(String name)
{this.name =name;
}
@Overridepublic void update(float temperature, float humidity, floatpressure)
{//TODO Auto-generated method stub
System.out.println(this.name + "觀察到當(dāng)前 --> 溫度:" + temperature + " 濕度:" + humidity + " 氣壓:" +pressure);
}
}
主方法測(cè)試:
public classTester
{/***@paramargs*/
public static voidmain(String[] args)
{//TODO Auto-generated method stub
WeatherData subject = newWeatherData();
WhiteBoard wb= new WhiteBoard("中央廣場(chǎng)白板");
MobileDevices iphone= new MobileDevices("iphone手機(jī)");
MobileDevices android= new MobileDevices("安卓手機(jī)");
subject.addObserver(wb);
subject.addObserver(iphone);
subject.weatherChanged(12, 23, 33);
subject.removeObserver(new MobileDevices("iphone手機(jī)"));
subject.addObserver(android);
subject.weatherChanged(22, 43, 25);
}
}
輸出結(jié)果:
中央廣場(chǎng)白板觀察到當(dāng)前 --> 溫度:12.0 濕度:23.0 氣壓:33.0
iphone手機(jī)觀察到當(dāng)前 --> 溫度:12.0 濕度:23.0 氣壓:33.0
中央廣場(chǎng)白板觀察到當(dāng)前 --> 溫度:22.0 濕度:43.0 氣壓:25.0
安卓手機(jī)觀察到當(dāng)前 --> 溫度:22.0 濕度:43.0 氣壓:25.0
總結(jié):
被觀察者應(yīng)該具備以下功能:
1) 能增加一個(gè)觀察者?addObserver
2)能移除一個(gè)觀察者?removeObserver
3)在數(shù)據(jù)改變的時(shí)候能將相應(yīng)的信息通知給被觀察者?notifyAllObservers
觀察者應(yīng)具備以下功能:
1)?update方法用于觀察者接收被觀察者的推送信息
總結(jié)
以上是生活随笔為你收集整理的java观察者_Java中的观察者模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: [云炬创业学笔记]第二章决定成为创业者测
- 下一篇: requestparam的作用_Spri