观察者模式
观察者模式
观察者模式中使用到两个类:
1.主题类:用于提供数据和数据变更实时提醒服务。
2.观察者类:获取到数据并使用数据。
以上两类均作为接口提供
package Observer;
/**
* 主题:注册,取消注册,通知 观察者
* @author TisaKong
* 2015-6-5
*/
public interface Subject {
public void registerObserver(Observer e);
public void removeObserver(Observer e);
public void notifyObserver();
}
package Observer;
/**
* 观察者接口,更新来自Object的最新数据
* @author TisaKong
* 2015-6-5
*/
public interface Observer {
public void update(float temp , float humidity , float pressure);
}
实例:
天气预报系统: “数据中心”用于提供实时的天气数据,每当有数据更新,及时通知“展示天气”的客户端更新数据
package Observer;
/**
* 展示数据接口
* @author TisaKong
* 2015-6-5
*/
public interface DisplayElement {
public void display();
}
数据中心:是一个实现Subject接口的类
package Observer;
import java.util.ArrayList;
import java.util.List;
/**
* 天气预报 ,实现Subject接口
* @author TisaKong
* 2015-6-5
* 提供天气数据的类(观察者模式中的主题类)
* 成员:各种天气数据,以及一个列表,用于维护在此注册了的观察者们。
* 功能:1.观察者注册;2.取消观察者的注册;3.天气数据变更时,更新天气数据;4.通知观察者们天气变更
* 构造方法:初始化维护列表。
*/
public class WeatherData implements Subject {
private List<Observer> observers;
private float temp;
private float humidity;
private float pressure;
public WeatherData() {
observers = new ArrayList<Observer>();
}
@Override
public void registerObserver(Observer e) {
observers.add(e);
}
@Override
public void removeObserver(Observer e) {
if(observers.contains(e)){
observers.remove(e);
}
}
@Override
public void notifyObserver() {
for(Observer o:observers){
o.update(temp, humidity, pressure);
}
}
public void setWeatherData(float temp , float humidity , float pressure){
this.temp = temp;
this.humidity = humidity;
this.pressure = pressure;
notifyObserver();
}
}
实时天气展示板:是一个实现Observer接口的类
package Observer;
/**
* 实时天气展示板:实现了观察者接口,和显示元素接口
* @author TisaKong
* 2015-6-5
* 用于展示实时天气数据的类(观察者模式中的观察者)
* 成员:各种天气数据,主题(观察者模式中的主题类),用于通知该注册成为那个主题的观察者
* 功能:1.更新天气数据(又主题对象在天气变更时调用,即观察者实时得到通知);2.展示天气数据(可以在控制台或者网页中输出天气数据)
* 构造方法:获得一个主题对象,调用其方法,注册成为它的观察者
*/
public class CurrentConditionsDisplay implements Observer, DisplayElement {
private float temp;
private float humidity;
private float pressure;
private Subject sub;
public CurrentConditionsDisplay(Subject sub) {
this.sub = sub;
sub.registerObserver(this);
}
@Override
public void display() {
System.out.println("currentCondition:"+"\n"+
"tempratry:"+temp+"\n"+
"humidity:"+humidity+"\n"+
"pressure:"+pressure);
}
@Override
public void update(float temp, float humidity, float pressure) {
this.temp = temp;
this.humidity = humidity;
this.pressure = pressure;
}
}
客户端测试:
package Observer;
/**
* 观察者模式客户端
* @author TisaKong
* 2015-6-5
*/
public class WeatherStation {
public static void main(String[] args) {
WeatherData wd = new WeatherData();
CurrentConditionsDisplay ccd = new CurrentConditionsDisplay(wd);
ccd.display();
System.out.println("--------------------华丽丽的分割线---------------------");
wd.setWeatherData(121, 221, 111);
ccd.display();
}
}

浙公网安备 33010602011771号