观察者模式,维护两类对象:主题和观察者,1对n的关系
观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖都会受到通知并自动通知。观察者依赖于主题,只要主题状态一有变化,观察者就会被通知。
主题唯一依赖的东西是一个实现Observer接口的对象列表,所以我们可以随时增加观察者。当主题有属性改动时,所有订阅了该主题的观察者都会被该主题通知到,所以主题应有的三个基本方法如下:
public interface Subject {
public void registerObserver(Observer o);
public void removeObserver(Observer o);
public void notifyObservers();
}
一个完整的主题实例:
public class WeatherData implements Subject {
private ArrayList<Observer> observers;
private float temperature;
private float humidity;
private float pressure;
public WeatherData() {
observers = new ArrayList<Observer>();
}
public void registerObserver(Observer o) {
observers.add(o);
}
public void removeObserver(Observer o) {
int i = observers.indexOf(o);
if (i >= 0) {
observers.remove(i);
}
}
public void notifyObservers() {
for (Observer observer : observers) {
observer.update(temperature, humidity, pressure);
}
}
public void measurementsChanged() {
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;
}
}
所以这里就要求,不管观察者具体是怎么实现的,他们对于主题来说都是一模一样的,都需要有统一的方法或接口来提供给主题去调用。
所以我们可以让观察者都统一去实现相同的接口。
public interface Observer {
public void update(float temp, float humidity, float pressure);
}
也可以使用Java内置的类来实现观察者模式
import java.util.Observable;
import java.util.Observer;