/** * 气象数据 */ public class WeatherData extends Observable { private float temperature; private float humidity; private float pressure; /** * 我们的构造器不再需要为了 记住观察者们而建立数据结 构了。 * 注意:我们没有调用 notifyObservers()传送数据对 象,这表示我们采用的做法 是“拉”。 */ public WeatherData(){} /** *在调用notifuObservers()之前,要先调 用setChanged()来指示状态已经改变。 */ public void measurementsChanged(){ setChanged(); notifyObservers(); } public void setMeasurements(float temperature, float humidity, float pressure) { this.temperature = temperature; this.humidity = humidity; this.pressure = pressure; measurementsChanged(); } public float getTemperature() { return temperature; } public float getHumidity() { return humidity; } public float getPressure() { return pressure; } } /** * 布告板行为接口 */ public interface DisplayElement { /** * @desc 当布告板需要显示时, 调用此方法 */ public void display(); } /** * 布告板 */ public class CurrentConditionsDisplay implements Observer, DisplayElement { Observable observable; private float temperature; private float humidity; /** * 现在构造器需要一 Observable当参数,并将 CurrentCondi- tionsDisplay对 象登记成为观察者 * @param observable observable */ public CurrentConditionsDisplay(Observable observable){ this.observable = observable; observable.addObserver(this); } @Override public void display() { System.out.println("Current conditions: " + temperature + "F degrees and " + humidity + "% humidity"); } /** * 在 update()中,先确定可 观察者属于WeatherData类 型,然后利用 getter方法 获取温度和湿度测量值, 最后调用display()。 * @param obs * @param arg */ @Override public void update(Observable obs, Object arg) { if (obs instanceof WeatherData) { WeatherData weatherData = (WeatherData)obs; this.temperature = weatherData.getTemperature(); this.humidity = weatherData.getHumidity(); display(); } } }
/** * 气象站 */ public class WeatherStation { public static void main(String[] args) { WeatherData weatherData = new 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); } }