观察者模式在对象间定义一对多的依赖,当一个对象改变状态,依赖它的对象都会收到通知。
类图:
一. java swing
swing 注册事件监听器过程,就是观察者模式。
// 注册监听事件
button.addActionListener( new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("Hello");
}
});
源码跟踪:
listenerList.add(ActionListener.class, l);// 添加至监听列表
actionPerformed(event);
fireActionPerformed(event);// 遍历监听列表,向所有对象发送event
二. java.util.Observable
java内置了观察者实现类Observable类,直接继承即可。
// 展示接口
interface DisplayElement{
public void display();
}
// 主题
class WeatherData extends Observable{
private float temperature;
private float pressure;
public void measurementChanged(){
this.setChanged(); // 指示状态改变
this.notifyObservers(); // 通知观察者
}
public void setMeasurement(float temperature, float pressure){
this.temperature = temperature;
this.pressure = pressure;
measurementChanged();
}
}
// 观察者
class ForecastDisplay implements Observer, DisplayElement{
private Observable observable; // 被观察者引用
private float temperature;
private float pressure;
public ForecastDisplay(Observable observable){
this.observable = observable;
// 添加观察者
this.observable.addObserver(this);
}
@Override
public void display() {
System.out.println("Forecast temperature: " + temperature + " pressure:" + pressure);
}
@Override
public void update(Observable o, Object arg) {
if (o instanceof WeatherData){
WeatherData data = (WeatherData)o;
this.temperature = data.getTemperature();
this.pressure = data.getPressure();
display();
}
}
}
源码跟踪:
observable.addObserver(this);
Vector<Observer>::addElement(o);
this.notifyObservers();// 从尾部开始遍历,后添加先通知