Welcome

首页 / 软件开发 / 数据结构与算法 / 观察者模式(Observer Pattern) Java内置使用方法

观察者模式(Observer Pattern) Java内置使用方法2016-03-27Java内置的观察者模式, 是通过继承父类, 实现观察者模式的几个主要函数:

Observerable(可被观察的): 是一个父类(class),addObserver(), 添加观察者; deleteObserver(), 删除观察者;

notifyObservers(), 通知观察者;setChanged(), 确认更改;

Observer(观察者): 是一个接口(interface), update(), 更新观察者数据;

setChanged()->notifyObservers(), 必须要先使用setChanged(), 再使用notifyObservers(), 即先确认提交, 再通知观察者;

观察者的更新接口update(Observerable o, Object arg), 即可以使用推(push), 也可以使用拉(pull);

如果notifyObservers(arg), 传递参数, 则为推(push)的方法, 如果没有参数, 则为拉(pull)的方式, 即使用get()方法获取;

观察者的通知(notify)顺序是先入后出的模式.

Observerable(可被观察的) 的 代码:

/*** @time 2014年5月22日*/package observer.java;import java.util.Observable;/*** @author C.L.Wang**/public class WeatherData extends Observable {private float temperature;private float humidity;private float pressure;public WeatherData() {}public void measurementsChanged() {setChanged();notifyObservers();}public void setMeasurements(float temperature, float humidity, float pressure) {this.temperature = temperature;this.humidity = humidity;this.pressure = pressure;measurementsChanged();}public float getTemperature() {return temperature;}public float getHumidity() {return humidity;}public float getPressure() {return pressure;}}
Observer(观察者)的代码:

/*** @time 2014年5月22日*/package observer.java;import java.util.Observable;import java.util.Observer;/*** @author C.L.Wang**/public class CurrentConditionsDisplay implements Observer, DisplayElement {Observable observable;private float temperature;private float humidity;public CurrentConditionsDisplay(Observable observable) {this.observable = observable;observable.addObserver(this);}/* (non-Javadoc)* @see observer.java.DisplayElement#display()*/@Overridepublic void display() {// TODO Auto-generated method stubSystem.out.println("Current conditions: " + temperature + "F degrees and " + humidity + "% humidity");}/* (non-Javadoc)* @see java.util.Observer#update(java.util.Observable, java.lang.Object)*/@Overridepublic void update(Observable o, Object arg) {// TODO Auto-generated method stubif (o instanceof WeatherData) {WeatherData weatherData = (WeatherData)o;this.temperature = weatherData.getTemperature();this.humidity = weatherData.getHumidity();display();}}}