<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Mark's Java Blog
    MyEclipse, Java EE, Spring, Struts, Hibernate, JPA, SWT, Swing, AJAX, JavaScript,SOA
    使用java.util.Observable類和java.util.Observer接口實現觀察者模式氣象站(拉、推均實現,自己也可以按照它的實現方法擴展)

    拉:也就是觀察者來決定接到“可觀察者”類通知時獲取“可觀察者”的哪些變化。調用方法notifyObservers();

    推:“可觀察者”類通知觀察者時傳遞給觀察者自身所有的變化。調用方法notifyObservers(Object arg);


    import java.util.Observable;
    import java.util.Observer;
     //此類實現的是“拉”的發式,繼承java.util.Observable類
    public class WeatherData extends Observable {
     private float temperature;
     private float humidity;
     private float pressure;
     //構造器不需要為了記住觀察者們而建立數據結構了
     public WeatherData() { }
     
     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;
     }
    }


    import java.util.Observable;
    import java.util.Observer;
     //實現java.util.Observer接口,成為觀察者
    public class CurrentConditionsDisplay implements Observer, DisplayElement {
     Observable observable;
     private float temperature;
     private float humidity;
     //構造器需要Observable 作為參數,并將本對象登記為觀察者
     public CurrentConditionsDisplay(Observable observable) {
      this.observable = observable;
      observable.addObserver(this);
     }
     //改變update()方法,增加Observable 和數據對象為參數
     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 void display() {
      System.out.println("Current conditions: " + temperature
       + "F degrees and " + humidity + "% humidity");
     }
    }

    注意:java.util.Observable是一個類而不是接口,而且還沒有實現任何接口。它本身的實現有很多問題,限制了它的使用和復用。由于它是個類,所以我們只能繼承,java不允許多繼承,所以限制了其復用潛力。而且setChanged()方法被保護起來(被定義成protected),這就意味著除非繼承,否則無法創建實例并組合到自己的對象中,這就違背了設計原則“多用組合,少用繼承”。
    posted on 2008-03-18 15:04 Mark 閱讀(253) 評論(0)  編輯  收藏 所屬分類: 設計模式
     
    主站蜘蛛池模板: 亚洲视频在线一区| 亚洲精品美女久久777777| 亚洲大香人伊一本线| 日本亚洲欧洲免费天堂午夜看片女人员 | 色www永久免费| 亚洲中文字幕日产乱码高清app| 免费精品国自产拍在线播放| 免费无码黄网站在线观看| 亚洲综合av一区二区三区| 国产高清在线免费| 色噜噜噜噜亚洲第一| 全部免费毛片免费播放| 国产大陆亚洲精品国产| 久久久久噜噜噜亚洲熟女综合 | 中文字幕高清免费不卡视频| 亚洲一区二区三区自拍公司| 三根一起会坏掉的好痛免费三级全黄的视频在线观看 | 亚洲色偷偷色噜噜狠狠99网| 成人免费福利电影| 亚洲精品无码人妻无码| 四虎影视在线永久免费观看| 男人扒开添女人下部免费视频| 久久久无码精品亚洲日韩软件| 99精品视频在线观看免费| 中文字幕亚洲免费无线观看日本| 永久在线免费观看| 日韩亚洲不卡在线视频中文字幕在线观看| 91在线视频免费播放| 精品女同一区二区三区免费播放 | 久久国产色AV免费看| 一本天堂ⅴ无码亚洲道久久| 国产成人免费a在线资源| 三根一起会坏掉的好痛免费三级全黄的视频在线观看 | 窝窝影视午夜看片免费| 久久久久久a亚洲欧洲aⅴ| 4455永久在线观免费看| 亚洲高清国产拍精品熟女| 亚洲色大成网站WWW久久九九| 最近中文字幕mv免费高清视频8| 亚洲日韩av无码中文| 国产gv天堂亚洲国产gv刚刚碰|