您的位置:首页 > 其它

【HeadFirst 设计模式】观察者模式

2014-01-03 00:02 316 查看
观察者模式:定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。

观察者模式的类图:



设计原则:为了交互对象之间的松耦合设计而努力。

观察者模式提供了一种对象设计,让主题和观察者之间松耦合。主题只知道观察者实现了某个接口(Observer接口)。主题不需要知道观察者的具体类是谁、做了些什么或其它任何细节。

松耦合的设计之所以能让我们建立有弹性的OO系统,能够应付变化,是因为对象之间的互相依赖降到了最低。

当两个对象之间松耦合,它们依然可以交互,但是不清楚彼此的细节。

Java内置的观察者模式

java.util包内包含最基本的Observer接口和Observable类。

类图:



示例:建立一个应用,利用WeatherData对象取得数据(temperature, humidity, pressure),并更新三个布告板:StatisticsDisplay, ForecastDisplay, ThirdPartyDisplay。

WeatherData.java

import java.util.Observable;
import java.util.Observer;

public class WeatherData extends Observable {
private float temperature;
private float humidity;
private float pressure;

public WeatherData() { }

public void measurementsChanged() {
setChanged(); //在调用notifyObservers之前,要先调用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;
}
}


CurrentConditionsDisplay.java
import java.util.Observable;
import java.util.Observer;

public class CurrentConditionsDisplay implements Observer, DisplayElement {
Observable observable;
private float temperature;
private float humidity;

public CurrentConditionsDisplay(Observable observable) {
this.observable = observable;
observable.addObserver(this);
}

//增加Observable和数据对象作为参数
public void update(Observable obs, Object arg) {
//确定可观察者属于WeatherData类型
if (obs instanceof WeatherData) {
WeatherData weatherData = (WeatherData)obs;
this.temperature = weatherData.getTemperature();
this.humidity = weatherData.getHumidity();
display();
}
}

public void display() {
System.out.println("Current conditions: " + temperature
+ "F degrees and " + humidity + "% humidity");
}
}


DisplayElement.java
public interface DisplayElement {
public void display();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: