head first 设计模式之----Observer pattern (二)
lse if (currentPressure == lastPressure) {
System.out.println("More of the same");
} else if (currentPressure < lastPressure) {
System.out.println("Watch out for cooler, rainy weather");
}
}
}
package com.clark.observerpattern.subject;
import java.util.ArrayList;
import com.clark.observerpattern.observer.Observer;
/**
* 模拟气象站的具体主题Subject
* @author Administrator
*
*/
public class WeatherData implements Subject {
private ArrayList observers;
private float temp;
private float humidity;
private float pressure;
public WeatherData() {
observers=new ArrayList();
}
@Override
public void registerObserver(Observer obj) {
observers.add(obj);
}
@Override
public void removeObserver(Observer obj) {
int i=observers.indexOf(obj);
if(i>=0){
observers.remove(i);
}
}
@Override
public void notifyAllObserver() {
for (int i = 0; i < observers.size(); i++) {
Observer o=(Observer) observers.get(i);
o.update(temp, humidity, pressure);
}
}
//当从气象站获取更新数据的时候,我们通知观察着
public void measurementsChange(){
notifyAllObserver();
}
//读取气象站数据
public void setMeasurements(float temp,float humidity,float pressure){
this.temp=temp;
this.humidity=humidity;
this.pressure=pressure;
measurementsChange();
}
}
package com.clark.observerpattern;
import com.clark.observerpattern.observer.ForecastDisplay;
import com.clark.observerpattern.observer.StatisticsDisplay;
import com.clark.observerpattern.subject.WeatherData;
/**
* 气象站
* @author Administrator
*
*/
public class WeatherStation {
public static void main(String[] args) {
WeatherData weatherData=new WeatherData();
//先往Subject中添加所有注册的主题
CurrentConditionsDisplay currentDisplay=new CurrentConditionsDisplay(weatherData);
StatisticsDisplay statistic=new StatisticsDisplay(weatherData);
ForecastDisplay foreCast=new ForecastDisplay(weatherData);
//再调用方法从主题中获取数据,从而在布告板中及时显示
weatherData.setMeasurements(50, 80, 66);
weatherData.setMeasurements(48, 80, 67);
weatherData.setMeasurements(52, 80, 65);
}
}