| 关键词: nbsp WeatherData public float humidity java temperature void Observer pressure |
Subject.java [java] public interface Subject{ public void registerObserver(Observer o); public void removeObserver(Observer o); public void notifyObservers(); } Observer.java[java] public interface Observer{ public void update(float temp,float humidity,float pressure); } DisplayElement.java [java] public interface DisplayElement{ public void display(); } WeatherData.java[java] import java.util.ArrayList; public class WeatherData implements Subject{ private ArrayList observers; private float temperature; private float humidity; private float pressure; public WeatherData(){ observers = new ArrayList(); } public void registerObserver(Observer o){ observers.add(o); } public void removeObserver(Observer o){ int i=observers.indexOf(o); if(i>=0){ observers.remove(i); } } public void notifyObservers(){ for(int i=0;i<observers.size();i++){ Observer observer=(Observer)observers.get(i); observer.update(temperature,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(); } } CurrentConditionDisplay.java [java] import java.io.*; public class CurrentConditionsDisplay implements Observer ,DisplayElement{ private float temperature; private float humidity; private WeatherData weatherData; public CurrentConditionsDisplay(WeatherData weatherData_){ this.weatherData= weatherData_; weatherData.registerObserver(this); } public void update(float temperature,float humidity,float pressure){ this.temperature = temperature; this.humidity = humidity; display(); } public void display(){ System.out.println("Current condition :"+temperature+" F degrees and "+ humidity + "%humidity"); } } WeatherStation.java [java] public class WeatherStation{ public static void main(String[] args){ WeatherData weatherData = new WeatherData(); CurrentConditionsDisplay currentDisplay= new CurrentConditionsDisplay(weatherData); weatherData.setMeasurements(80,65,30.4f); } } 这种编码方式不是最好的解决方法,有其他可以改进的N种方法。比如说采用MVC混合模式来设计。而且上面设计的代码 有个弊端就是,当客户端的一个发布站点要更新数据时,服务器端就需要遍历 更新 全部站点的数据并发布,其实只有客户端的数据一个数据变化了,其他的仍然是原先的状态(值未变),既然值未变,服务端仍用原先值来做下更新的动作,是不是显得多此一举了呢。 下面是改进的一个方法: Subject.java [java] public interface Subject{ public void registerObserver(Observer o); public void removeObserver(Observer o); } Observer.java [java] public interface Observer{ public void _setM(float temp,float humidity,float pressure); } DisplayElement.java [java] public interface DisplayElement{ public void display(); } WeatherData.java [java] import java.util.ArrayList; public class WeatherData implements Subject{ private ArrayList observers; private float temperature; private float humidity; private float pressure; public WeatherData(){ observers = new ArrayList(); } public void registerObserver(Observer o){ observers.add(o); } public void removeObserver(Observer o){ int i=observers.indexOf(o); if(i>=0){ observers.remove(i); } } public void display(){ System.out.println("Current condition :"+temperature+" F degrees and "+ humidity + "%humidity"); } public void setMeasurements(float temperature,float humidity,float pressure){ this.temperature = temperature; this.humidity = humidity; this.pressure = pressure; } } CurrentConditionDisplay.java [java] import java.io.*; public class CurrentConditionsDisplay implements Observer ,DisplayElement{ private float temperature; private float humidity; private WeatherData weatherData; public CurrentConditionsDisplay(WeatherData weatherData_){ this.weatherData= weatherData_; weatherData.registerObserver(this); } public void _setM(float temperature,float humidity,float pressure){ weatherData.setMeasurements(temperature,humidity,pressure); } public void display(){ weatherData.display(); } } WeatherStation.java[java] public class WeatherStation{ public static void main(String[] args){ WeatherData weatherData = new WeatherData(); CurrentConditionsDisplay currentDisplay= new CurrentConditionsDisplay(weatherData); currentDisplay._setM(80,65,30.4f); currentDisplay.display(); } } 当然,以上阐述有个bug,因为观察者模式就是默认通知所有“订阅者”的。根据需要来设计了。 |
|
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系
[邮箱地址] 删除
|