观察者模式是对象的行为模式,顾名思义,即存在观察者和被观察者。 观察者模式可以让多个观察者同时监听同一个被观察对象,当被观察对象发生变化时,并通知所有观察者,使各个观察者能作出相应的响应。
在java中提供了Observerable类和Observer接口来实现观察者模式。
JAVA 内置的 Observer 类不是一个好的设计。首先,因为 Observable 是一个“类”,则必须设计一个类继承它,如果某类想同时具有 Observable 类和另一个超类的行为,就会陷入两难,这限制了Observale 的复用潜力。其次,Observable 将关键方法 setChange() 方法保护起来,这意味着:除非你继承自 Observable ,否则无法创建 Observable 实例并组合到自己的对象中来,这个设计违法了第二个设计原则:“多用组合,少用继承”。
1、被观察者继承observable
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; } }
2、观察者实现Observer接口
public class CurrentConditionsDisplay implements Observer, DisplayElement { private float temperature; private float humidity; private float pressure; private Observable observable; public CurrentConditionsDisplay(Observable observable) { this.observable = observable; this.observable.addObserver(this); } @Override public void display() { System.out.println("Current conditions:" + temperature + "F degrees and " + humidity + "% humidity " + pressure + " pressure"); } @Override public void update(Observable obs, Object arg) { if(obs instanceof WeatherData){ WeatherData weatherData = (WeatherData) obs; this.humidity = weatherData.getHumidity(); this.temperature = weatherData.getTemperature(); display(); } } }
3、测试类
public class Test { /** * @param args */ public static void main(String[] args) { WeatherData wd = new WeatherData(); CurrentConditionsDisplay ccd = new CurrentConditionsDisplay(wd); wd.setMeasurements(21, 13, 30.4f); wd.setMeasurements(1, 2, 3f); } }