Dev@Free

          zJun's Tech Weblog

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

          Java作為一種面向?qū)ο蟮拈_發(fā)語言,對實現(xiàn)設(shè)計模式提供了良好的支持,并且提供了許多默認(rèn)的實現(xiàn),比如:通過Java中的Observable類Observer接口可以方便的實現(xiàn)觀察者模式。

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

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

          被觀察對象:地球?(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;
          ????????
          // ?設(shè)置變化點

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

          }

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

          觀察者:氣象衛(wèi)星(Satellite)

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

          /**
          ?*?觀察對象:氣象衛(wèi)星
          ?*?
          ?*?
          @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);
          ????}

          }

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

          /**
          ?*?客戶端調(diào)用:天氣預(yù)報
          ?*?
          ?*?
          @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();
          ????????
          // ?發(fā)射氣象衛(wèi)星

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

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

          }

          [運行結(jié)果]

          天氣預(yù)報:
          ------------
          近期天氣變化:臺風(fēng)‘珍珠’逼近
          近期天氣變化:大到暴雨
          近期天氣變化:天氣炎熱

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

          評論

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

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

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

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


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           

          導(dǎo)航

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

          統(tǒng)計

          常用鏈接

          留言簿(15)

          隨筆分類

          隨筆檔案

          相冊

          收藏夾

          博客

          文檔

          站點

          論壇

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 明溪县| 蒲城县| 台江县| 镇远县| 双江| 马公市| 霸州市| 科尔| 敦煌市| 衡阳市| 汤阴县| 融水| 开江县| 淮阳县| 衡水市| 白朗县| 桦甸市| 拉萨市| 蒙城县| 察哈| 延寿县| 大理市| 青铜峡市| 湘潭市| 红河县| 高台县| 汝州市| 垦利县| 施秉县| 剑阁县| 开江县| 江川县| 武胜县| 梁平县| 沾益县| 鹰潭市| 且末县| 德阳市| 肇源县| 达拉特旗| 宁夏|