首页 电脑 电脑学堂 查看内容

设计模式

2013-9-18 09:59 499 0

摘要: Subject.java [java]  public interface Subject{      public void registerObs...
关键词: 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,因为观察者模式就是默认通知所有“订阅者”的。根据需要来设计了。
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

最新评论

返回顶部