观察者模式(Observer Pattern) 详解
版权所有, 禁止转载, 如有转载, 请站内联系.
观察者模式(Observer Pattern): 定义了对象之间的一对多的依赖, 这样一来, 当一个对象改变状态时, 它的所有依赖者都会收到通知并自动更新.
使用方法:
1. 首先新建主题(subject)接口, 负责注册(register)删除(remove)通知(notify)观察者; 观察者(observer)接口, 负责更新(update)数据;
主题(subject)接口: 注册观察者(registerObserver), 删除观察者(removeObserver), 通知观察者(notifyObservers, 通知所有观察者);
观察者(observer)接口: 更新(update);
代码:
/**
* @time 2014年5月22日
*/
package observer;
/**
* @author C.L.Wang
*
*/
public interface Subject {
public void registerObserver(Observer o);
public void removeObserver(Observer o);
public void notifyObervers();
}
/**
* @time 2014年5月22日
*/
package observer;
/**
* @author C.L.Wang
*
*/
public interface Observer {
public void update(float temp, float humidity, float pressure);
}
/**
* @time 2014年5月22日
*/
package observer;
/**
* @author C.L.Wang
*
*/
public interface DisplayElement {
public void display();
}
2. 实现 主题(subject)接口, 通过 列表(list)的形式 注册(register)和删除(remove)观察者,
通知(notify)观察者时, 循环调用所有已注册的观察者的更新(update)动作;
通过接口函数(set), 封装通知(notify)动作, 传入参数并进行通知.
代码:
/**
* @time 2014年5月22日
*/
package observer;
import java.util.ArrayList;
/**
* @author C.L.Wang
*
*/
public class WeatherData implements Subject {
public ArrayList
observers;
private float temperature;
private float humidity; //湿度
private float pressure;
public WeatherData() {
observers = new ArrayList
(); } /* (non-
Javadoc) * @see observer.Subject#registerObserver(observer.Observer) */ @Override public void registerObserver(Observer o) { // TODO Auto-generated method stub observers.add(o); } /* (non-Javadoc) * @see observer.Subject#removeObserver(observer.Observer) */ @Override public void removeObserver(Observer o) { // TODO Auto-generated method stub int i = observers.indexOf(o); if (i>=0) { observers.remove(i); } } /* (non-Javadoc) * @see observer.Subject#notifyObervers() */ @Override public void notifyObervers() { // TODO Auto-generated method stub for (int i=0; i
3. 实现
观察者(observer)接口, 主要保存收到的数据, 并实现
更新(update)动作, 即把数据保存在本地;
在构造函数中, 把自己注册(register)入, 传入的主题(subject)参数, 使主题可以通知观察者.
代码:
/**
* @time 2014年5月22日
*/
package observer;
/**
* @author C.L.Wang
*
*/
public class CurrentConditionsDisplay implements Observer, DisplayElement {
private float temperature;
private float humidity;
private Subject weatherData;
public CurrentConditionsDisplay(Subject weatherData) {
this.weatherData = weatherData;
weatherData.registerObserver(this);
}
/* (non-Javadoc)
* @see observer.DisplayElement#display()
*/
@Override
public void display() {
// TODO Auto-generated method stub
System.out.println(Current conditions: + temperature +
F degrees and + humidity + % humidity);
}
/* (non-Javadoc)
* @see observer.Observer#update(float, float, float)
*/
@Override
public void update(float temperature, float humidity, float pressure) {
// TODO Auto-generated method stub
this.temperature = temperature;
this.humidity = humidity;
display();
}
}
package observer;
import java.util.*;
public class ForecastDisplay implements Observer, DisplayElement {
private float currentPressure = 29.92f;
private float lastPressure;
private WeatherData weatherData;
public ForecastDisplay(WeatherData weatherData) {
thi