JAVA设计模式 之 观察者模式(JDK内置实现)
简介:使用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