Dev@Free

          zJun's Tech Weblog

          [GoF23] Java中的觀察者模式(Observer)

          Java作為一種面向對象的開發語言,對實現設計模式提供了良好的支持,并且提供了許多默認的實現,比如:通過Java中的Observable類Observer接口可以方便的實現觀察者模式。

          下面我們就用一個實際的例子來說明:日常生活中說起觀察者,最常見的例子可能就是天氣預報,在這里我們的觀察對象是地球,而我們是通過發射氣象衛星這個觀察者來檢測地球氣象變化的。

          所以這個例子中涉及三個對象:
          地球?(Earth):?????????????????????被觀察對象
          氣象衛星(Satellite):????????????觀察者
          氣象局(WeatherService):??? 客戶端調用

          被觀察對象:地球?(Earth)

          import ?java.util.Observable;

          /**
          ?*?被觀察對象:地球
          ?*?
          ?*?
          @author ?zjun
          ?*?
          @version
          ?1.0?create?on?2006-5-18?9:42:45
          ?
          */

          public ? class ?Earth? extends ?Observable? {
          ????
          private ?String?weather? = ? " 晴朗 "
          ;

          ????
          /**
          ?????*?
          @return ?Returns?the?weather.
          ?????
          */

          ????
          public ?String?getWeather()? {
          ????????
          return
          ?weather;
          ????}


          ????
          /**
          ?????*?
          @param ?weather
          ?????*????????????The?weather?to?set.
          ?????
          */

          ????
          public ? void ?setWeather(String?weather)? {
          ????????
          this .weather? =
          ?weather;
          ????????
          // ?設置變化點

          ????????setChanged();
          ????????notifyObservers(weather);
          ????}

          }

          [注意] 在需檢測的對象前需要設置變化點setChanged()通知觀察者notifyObservers(),這兩個函數是由Observable類實現的,封裝了觀察者模式實現的細節。

          觀察者:氣象衛星(Satellite)

          import ?java.util.Observable;
          import
          ?java.util.Observer;

          /**
          ?*?觀察對象:氣象衛星
          ?*?
          ?*?
          @author ?zjun
          ?*?
          @version
          ?1.0?create?on?2006-5-18?9:46:30
          ?
          */

          public ? class ?Satellite? implements ?Observer? {
          ????
          private
          ?String?weather;

          ????
          public ? void ?update(Observable?obj,?Object?arg)?
          {
          ????????weather?
          =
          ?(String)?arg;
          ????????
          // ?捕獲天氣變化情況,反饋給檢測者

          ????????System.out.println( " 近期天氣變化: " ? + ?weather);
          ????}

          }

          客戶端調用:氣象局(WeatherService)

          /**
          ?*?客戶端調用:天氣預報
          ?*?
          ?*?
          @author ?zjun
          ?*?
          @version
          ?1.0?create?on?2006-5-18?9:57:19
          ?
          */

          public ? class ?WeatherService? {

          ????
          /**
          ?????*?
          @param ?args
          ?????
          */

          ????
          public ? static ? void ?main(String[]?args)? {
          ????????Earth?earth?
          = ? new
          ?Earth();
          ????????
          ????????Satellite?satellite?
          = ? new
          ?Satellite();
          ????????
          // ?發射氣象衛星

          ????????earth.addObserver(satellite);

          ????????System.out.println(
          " 天氣預報: "
          );
          ????????System.out.println(
          " ------------ "
          );
          ????????earth.setWeather(
          " 臺風‘珍珠’逼近 "
          );
          ????????earth.setWeather(
          " 大到暴雨 "
          );
          ????????earth.setWeather(
          " 天氣炎熱 "
          );
          ????}

          }

          [運行結果]

          天氣預報:
          ------------
          近期天氣變化:臺風‘珍珠’逼近
          近期天氣變化:大到暴雨
          近期天氣變化:天氣炎熱

          posted on 2006-05-18 10:54 zJun's帛羅閣 閱讀(1939) 評論(2)  編輯  收藏 所屬分類: 設計模式

          評論

          # re: [GoF23] Java中的觀察者模式(Observer) 2006-05-19 10:30 Harryson

          你可真又靈感哈,
          真會思考,居然把這次的自然現象也用java來實現了.呵呵,  回復  更多評論   

          # re: [GoF23] Java中的觀察者模式(Observer) 2006-05-22 22:23 zJun

          @Harryson
          呵呵,前幾天到處都在討論這個“珍珠”,所以順手就寫下來了。  回復  更多評論   

          導航

          <2006年5月>
          30123456
          78910111213
          14151617181920
          21222324252627
          28293031123
          45678910

          統計

          常用鏈接

          留言簿(15)

          隨筆分類

          隨筆檔案

          相冊

          收藏夾

          博客

          文檔

          站點

          論壇

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 延吉市| 遵义市| 洪泽县| 林州市| 汉川市| 青海省| 闵行区| 余江县| 伊川县| 神农架林区| 诸暨市| 镇江市| 青田县| 漳浦县| 秀山| 山东省| 牙克石市| 望谟县| 武穴市| 阜新市| 镇原县| 额济纳旗| 古蔺县| 舒城县| 齐河县| 综艺| 大邑县| 寻甸| 尤溪县| 桃江县| 华坪县| 吕梁市| 铜山县| 马鞍山市| 蓬安县| 珠海市| 怀集县| 济阳县| 分宜县| 北宁市| 甘肃省|