观察者模式定义了对象之间的一对多依赖,这样当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。
观察者模式中主题与观察者之间的关系:观察者依赖于主题,只要主题状态发生改变,就会通知观察者,因此定义了如下类图。
设计了一个主题接口、一个观察者接口和两个对应的实体类:
1. interface subject:主题接口,主要负责通知观察者更新数据、添加观察者和删除观察者。
2. interface Observer:观察者接口,主要负责更新观察者所观测的数据。
3. class ConcreteSubject:主题实体,主要实现主题接口中的接口方法和观察数据的产生。
4. class ConcreteObserver:观察者实体,主要实现观察数据的处理以及更新方法。
从上述类图可见,主题不需要知道观察者的设计与实现,只需要通过Observer对象传递数据,而相似的,观察者只需要从Observer对象中取出数据即可,实现了主题与观察者之间的松耦合。当有新的观察者时,只需要通过subject接口添加。观察者的数据更新是通过主题实体的Notify方法调用了update方法,实现了IOC。
Demo如下:
使用java内置的观察者模式,WeatherData实现了Observer被观察者,CurrentConditionsDisplay实现了Observable观察者,当WeatherData数据改变时,则通知CurrentConditionDisplay,提示其更新数据。
import java.util.Observable;
import java.util.Observer;
public class CurrentConditionsDisplay implements Observer, DispalyElement{
Observable observable;
private float temperature;
private float humidity;
public CurrentConditionsDisplay(Observable observable) {
super();
this.observable = observable;
observable.addObserver(this);
}
@Override
public void display() {
// TODO Auto-generated method stub
System.out.println("1:temp: " + temperature + " ,hum: " + humidity);
}
@Override
public void update(Observable o, Object arg) {
// TODO Auto-generated method stub
if (o instanceof WeatherData) {
WeatherData weatherData = (WeatherData) o;
this.temperature = weatherData.getTemperature();
this.humidity = weatherData.getHumidity();
display();
}
}
}
WeatherData实现:
import java.util.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.pressure = pressure;
this.humidity = humidity;
measurementsChanged();
}
public float getTemperature() {
return temperature;
}
public float getHumidity() {
return humidity;
}
public float getPressure() {
return pressure;
}
}