日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

java观察者_Java中的观察者模式

發(fā)布時間:2025/3/15 java 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java观察者_Java中的观察者模式 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

讓一個類能夠被觀察,則該類需要繼承java.util.Observable類。

要讓一個類成為觀察者,則該類需要實現(xiàn)java.util.Observable接口。

讓觀察者和被觀察者建立聯(lián)系通過Observable的addObserver(Object obj)方法。

讓被觀察者通知觀察者,通過Observable類中的setChanged()和notifyObservers(Object obj)方法。

下面的例子定義了一個售房中心類和一個賣家類。售房中心為被觀察者,買房者為觀察者。售房中心房價發(fā)生變化,則將相應(yīng)的信息通知買房者。

代碼如下:

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+"房價變?yōu)?" + arg + "萬");

}

}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è)觀察到:金悅城房價變?yōu)?1.5萬

龍城中介觀察到:金悅城房價變?yōu)?1.5萬

金旭地產(chǎn)觀察到:金悅城房價變?yōu)?1.5萬============

============祥龍置業(yè)觀察到:金悅城房價變?yōu)?1.2萬

龍城中介觀察到:金悅城房價變?yōu)?1.2萬

金旭地產(chǎn)觀察到:金悅城房價變?yōu)?1.2萬============

上面的代碼是利用了Java對觀察者模式的支持。下面用另一個例子說明觀察者模式運行規(guī)則。

Observerable接口(定義被觀察者的規(guī)范):

public interfaceObserverable

{voidaddObserver(ObserverBehavior newObserver);voidremoveObserver(ObserverBehavior observerToBeRemoved);voidnotifyAllObservers();

}

ObserverBehavior接口(定義觀察者的規(guī)范):

public interfaceObserverBehavior

{void update(float temperature, float humidity, floatpressure);

}

WeatherData類實現(xiàn)Observerable接口,其是真實的被觀察者類:

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實現(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實現(xiàn)了ObserverBehavior類(另一個真正的觀察者):

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);

}

}

主方法測試:

public classTester

{/***@paramargs*/

public static voidmain(String[] args)

{//TODO Auto-generated method stub

WeatherData subject = newWeatherData();

WhiteBoard wb= new WhiteBoard("中央廣場白板");

MobileDevices iphone= new MobileDevices("iphone手機");

MobileDevices android= new MobileDevices("安卓手機");

subject.addObserver(wb);

subject.addObserver(iphone);

subject.weatherChanged(12, 23, 33);

subject.removeObserver(new MobileDevices("iphone手機"));

subject.addObserver(android);

subject.weatherChanged(22, 43, 25);

}

}

輸出結(jié)果:

中央廣場白板觀察到當(dāng)前 --> 溫度:12.0 濕度:23.0 氣壓:33.0

iphone手機觀察到當(dāng)前 --> 溫度:12.0 濕度:23.0 氣壓:33.0

中央廣場白板觀察到當(dāng)前 --> 溫度:22.0 濕度:43.0 氣壓:25.0

安卓手機觀察到當(dāng)前 --> 溫度:22.0 濕度:43.0 氣壓:25.0

總結(jié):

被觀察者應(yīng)該具備以下功能:

1) 能增加一個觀察者?addObserver

2)能移除一個觀察者?removeObserver

3)在數(shù)據(jù)改變的時候能將相應(yīng)的信息通知給被觀察者?notifyAllObservers

觀察者應(yīng)具備以下功能:

1)?update方法用于觀察者接收被觀察者的推送信息

總結(jié)

以上是生活随笔為你收集整理的java观察者_Java中的观察者模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。