简介:使用JAVA内置的帮你搞定观察者模式。
1. 先把类图放在这里:
(1). Observable类追踪所有的观察者,并通知他们。
(2). Observer这个接口看起来很熟悉,它和我们之前写的类几乎一样。
(3). WeatherData这就是我们以前所称的“主题”Subject,从今以后也可以改称为“可观察者”,我们不需要在提供Register(),remove(),notifyObservers()方法。因为我们已经从超类继承了这些行为。
2. 如何把对象编程观察者
如果以前一样,实现观察者接口(java.util.Observer),然后调用任何Observable对象的addObserver()方法,不想在当观察者时,就调用deleteObserver()方法即可。
3. 可观察者如何送出通知
首先,你需要利用扩展java.util.Observable接口产生“可观察者”类,然后,需要两个步骤:
第一:先调用setChanged()方法,标记状态已经改变的事实。
第二:然后调用两种nofityObservers()方法中的一个。
notifyobservers() 或 notifyobservers(Object arg) 当通知时,arg参数为参数将传送给美一个观察者对象。
4. 观察者如何接收通知
同以前一样,观察者实现了更新的方法,但是方法的签名不太一样, 如:
update(Observable o, Object arg)
(1). 将主题本身当做一个对象,好让观察者知道是哪个主题通知它的。
(2). 第二个参数就是传入notityObservers()的数据对象,如果没有说明为空,如果你想“推”数据给观察者对象就用该参数,否则观察者就必须从可观察者拉数据过来。
5. 代码实现
(1)WeatherData.java类, 你可以看到它已经实现了Observable类。
package com.chengzhang.subject; import java.util.Observable; public class WeatherData extends Observable { private float temperatrue; private float humidity; private float pressure; public WeatherData(){}; public void measurementsChanged(){
setChanged();
notifyObservers();
} public float getTemperature(){
return temperatrue;
} public float getHumidity(){
return humidity;
} public float getPressure(){
return pressure;
} // 天气发生变化
public void setMeasurements(float temperature, float humidity, float pressure){
this.temperatrue = temperature;
this.humidity = humidity;
this.pressure = pressure;
measurementsChanged();
} }
(2). CurrentConditionsDisplay.java类
package com.chengzhang.subject; import java.util.Observable;
import java.util.Observer; public class CurrentConditionsDisplay implements Observer, Display { private Observable observable; private float temperature; private float pressure; private float humidity; public CurrentConditionsDisplay(Observable observable){
this.observable = observable;
this.observable.addObserver(this);
} @Override
public void update(Observable observable, Object obj) {
if(observable instanceof WeatherData){
WeatherData weatherData = (WeatherData)observable;
this.temperature = weatherData.getTemperature();
this.humidity = weatherData.getHumidity();
this.pressure = weatherData.getPressure();
display();
}
} @Override
public void display() {
System.out.println("当前温度:" + this.temperature);
System.out.println("当期湿度:" + this.humidity);
System.out.println("当期气压:" + this.pressure);
} }
(3). WeatherStation.java类
package com.chengzhang.subject; public class WeatherStation { public static void main(String[] args) { WeatherData weatherData = new WeatherData(); CurrentConditionsDisplay CurrentConditionsDisplay = new CurrentConditionsDisplay(weatherData); weatherData.setMeasurements(23, 35, 12);
} }
(4). 输出结果
当前温度:23.0
当期湿度:35.0
当期气压:12.0