设计气象站(案例)
public interface Subject{ /* *这两个方法都需要观察者作为变量,该观察者是用来注册或被删除的 */ public void registerObserver(Observer o); public void removeObserver(Observer o); //当主题状态改变时,这个方法会被调用,以通知所有的观察者 public void notifyObserver(Observer o); }
//所有的观察者都必须实现update()方法, //以实现观察者接口。 //在这里,我们按照Mar和Sue的想法把观测值传入观察者中 public interface Observer{ public void update(float temp,float humidity,float pressure);//当气象观测值改变时,主题会把这些状态值当作方法的参数,传给观察者 }
//DisplayElement接口只包含了一个方法,也就是display()方法。 //当布告板需要显示时,调用此方法。 public interface DisplayElement(){ public void display(); }
//WeatherData现在实现了Subject接口 public class WeatherData implements Subject{ private ArrayList observers;//我们加上了一个ArrayList来记录观察者,此ArrayList是在构造器中建立的。 private float temperature; private float humidity; private float pressure; public WeatherData(){ observers = new ArrayList(); } //当注册观察者时,我们只要把他们加到ArrayList的后面即可。 public void registerObserver(Observer o){ observers.add(o); } //同样地,当观察者想取消注册,我们把他从ArrayList中删除即可。 public void removeObserver(Observer o){ int i=observers.indexOf(o); if(i>=0){ observers.remove(i); } } //在这里,我们把状态告诉每一个观察者。因为观察者都实现了update()方法,所以我们知道如何通知他们。 public void notifyObservers(){ for(int i=0;i<observers.size();i++){ Observer observer = (Observer)observers.get(i); observer.update(teperature,humidity,pressure); } } //当从气象站得到更新观测值时,我们通知观察者。 public void measurementsChanged(){ notifyObservers(); } public void setMeasurements(float temperature,float humidity,float pressure){ this.temperature = temperature; this.humidity = humidity; this.pressure = pressure; measurementsChanged(); } //WeatherData的其他方法 }
现在,我们来建立布告板吧!
//此布告板实现了Observer接口,所以可以从WeatherData对象中获得改变 //它也实现了DisplayElement接口,因为我们的API规定所有的布告板都必须实现此接口 public class CurrentConditionsDisplay implements Observer,DisplayElement{ private float temperature; private float humidity; private float Subject WeatherData; //构造器需要weatherData对象(也就是主题)作为注册之用 public CurrentConditionsDisplay(Subject weatherData){ this.weatherData = weatherData; weatherData.registerObserver(this); } //当update()被调用时,我们把温度和湿度保存起来,然后调用display() public void update(float temperature,float humidity,float pressure){ this.temperature=temperature; this.humidity=humidity; display(); } //display()方法就只是把最近的温度和湿度显示出来 public void Display(){ System.out.println("Current conditions:"+temperature+"F degrees and"+humidity+"% humidity"); } }
1.先建立一个测试程序
public class WeatherStation{ public static void main(String[] args){ //首先,建立一个WeatherData对象 WeatherData weatherData = new WeatherData(); //建立三个布告板,并把WeatherData对象传给它们 CurrentConditionsDisplay currentDisplay = new CurrentConditionsDisplay(weatherData); StatisticsDisplay statisticsDisplay = new StatisticsDisplay(weatherData); ForecastDisplay forecastDisplay = new ForecastDisplay(weatherData); //模拟新的气象测量 weatherData.setMeasurements(80,65,30.4f); weatherData.setMeasurements(82,70,29.2f); weatherData.setMeasurements(78,90,29.2f); } }
版权声明:本文为博主原创文章,未经博主允许不得转载。