Head First设计模式之观察者模式
1 定义
观察者模式-在对象之间定义的一对多依赖,这样依赖,当一个状态改变状态,依赖它的对象都会收到通知,并自动更新
2 要点
1 观察者模式定义了对象之间的一对多关系
2 主题(也就是观察者)用一个共同的接口来更新观察者
3 观察者和可观察者之间用松耦合方式结合,可观察者不知道观察者的细节,只知道观察者实现了观察者的接口
4 有多个观察者时,不可以依赖特定的顺序通知次序
5 java有多中观察者模式的实现,包括了通用的 java.util.Observable
6 此模式被应用在许多地方,比如JavaBeans、RMI
3 新增原则
1 为交互对象之间的松耦合设计而努力
4 代码实例
package Observer;
public interface Observer {
public void update(float temp,float humidity,float pressure);
}
package Observer;
public interface Subject {
public void registerObserver(Observer o);
public void removeObserver(Observer o);
public void notifyObserver();
}
package Observer;
public interface DisplayElement {
public void display();
}
package Observer;
public class CurrentDisplay implements Observer,DisplayElement{
private float temperature;
private float humidity;
private Subject weatherDate;
public CurrentDisplay(Subject weatherDate)
{
this.weatherDate=weatherDate;
weatherDate.registerObserver(this);
}
public void update(float temperature,float humidity,float pressure)
{
this.temperature=temperature;
this.humidity=humidity;
display();
}
public void display()
{
System.out.println("目前状况是温度:"+temperature+"度 "+"湿度:"+humidity+"%");
}
}
package Observer;
import java.util.ArrayList;
public class WeatherData implements Subject {
private ArrayList observers;
private float temperature;
private float pressure;
private float humidity;
public WeatherData() {
observers = new ArrayList(); //加上一个ArrayList来记录观察者,此ArrayList是在构造器中产生的
}
public void registerObserver(Observer o) {
observers.add(o); //有观察者注册时,将其加到ArrayList后面
}
public void removeObserver(Observer o) {
int i = observers.indexOf(o); //观察者取消注册时,将其从ArrayList中删除
if (i >= 0) {
observers.remove(i);
}
}
public void notifyObserver() {
for (int i = 0; i < observers.size(); i++) { //通知每一位观察者
Observer observer = (Observer) observers.get(i);
observer.update(temperature, humidity, pressure);
}
}
public void measurementsChanged() {
notifyObserver();
}
public void setMeasurements(float temperature, float humidity,
float pressure) {
this.temperature = temperature;
this.humidity = humidity;
this.pressure = pressure;
measurementsChanged();
}
}
package Observer;
public class WeatherStation {
public static void main(String[] args)
{
WeatherData weatherData=new WeatherData(); //建立一个WeatherData对象
CurrentDisplay currentDisplay=new CurrentDisplay(weatherData); //建立布告板,并把WeatherData传给它们
weatherData.setMeasurements(80, 65, 30.4f); //模拟新的气象测量
weatherData.setMeasurements(82, 70, 29.2f);
weatherData.setMeasurements(78, 90, 29.2f);
}
}