设计模式学习--观察者模式(Oberser Pattern)
2013年5月18日 天气:热!
下午15:28 设计模式学习中
学习者:小巫
什么是观察者模式?
定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。
怎么设计一个观察者模式的程序?
确定两个对象:1. 主题
2.观察者
确定这两个对象之间的关系:
主题对象管理某些数据,一旦数据发生改变,会主动向观察者进行通知,然而观察者不必向主题进行索取。
主题并不知道具体的观察者是谁,这是它们之间的关系。
以上涉及到的设计原则:
为了交互对象之间的松耦合设计而努力
具体实例:气象站的实现
1. 定义一个主题接口Subject
[java]
package observerPattern;
/**
* 主题接口
* @author wwj
*
*/
public interface Subject {
public void registerObserver(Observer o); //这两个方法都需要一个观察者作为变量,该观察者是用那个来注册和删除的
public void removeObserver(Observer o);
public void notifyObserver(); //当主题状态发生改变时,这个方法会被调用,以通知所有的观察者
}
package observerPattern;
/**
* 主题接口
* @author wwj
*
*/
public interface Subject {
public void registerObserver(Observer o); //这两个方法都需要一个观察者作为变量,该观察者是用那个来注册和删除的
public void removeObserver(Observer o);
public void notifyObserver(); //当主题状态发生改变时,这个方法会被调用,以通知所有的观察者
}
2. 定义一个观察者接口Observer
[java]
package observerPattern;
/**
* 观察者接口
* @author wwj
*
*/
public interface Observer {
public void update(float temp, float humidity, float pressure);
}
package observerPattern;
/**
* 观察者接口
* @author wwj
*
*/
public interface Observer {
public void update(float temp, float humidity, float pressure);
}
3. 定义一般气象布告板接口DisplayElement
[java]
package observerPattern;
/**
* 公告板接口
* @author wwj
*
*/
public interface DisplayElement {
public void display();
}
package observerPattern;
/**
* 公告板接口
* @author wwj
*
*/
public interface DisplayElement {
public void display();
}
4. 定义主题类:WeatherData实现接口
[java]
package observerPattern;
import java.util.ArrayList;
/**
* WeatherData实现了Subject接口
* @author wwj
*
*/
public class WeatherData implements Subject {
private ArrayList observers; //用于记录观察者
private float temperature; //温度
private float humidity; //湿度
private float pressure; //压力
public WeatherData() {
observers = new ArrayList();
}
@Override
public void registerObserver(Observer o) {
observers.add(o);
}
@Override
public void removeObserver(Observer o) {
int i = observers.indexOf(o);
if(i >= 0) {
observers.remove(i);
}
}
@Override
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 observerPattern;
import java.util.ArrayList;
/**
* WeatherData实现了Subject接口
* @author wwj
*
*/
public class WeatherData implements Subject {
private ArrayList observers; //用于记录观察者
private float temperature; //温度
private float humidity; //湿度
private float pressure; //压力
public WeatherData() {
observers = new ArrayList();
}
@Override
public void registerObserver(Observer o) {
observers.add(o);
}
@Override
public void removeObserver(Observer o) {
int i = observers.indexOf(o);
if(i >= 0) {
observers.remove