Dev@Free

          zJun's Tech Weblog

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

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

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

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

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

          import ?java.util.Observable;

          /**
          ?*?被觀察對(duì)象:地球
          ?*?
          ?*?
          @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è)置變化點(diǎn)

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

          }

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

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

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

          /**
          ?*?觀察對(duì)象:氣象衛(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;
          ????????
          // ?捕獲天氣變化情況,反饋給檢測(cè)者

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

          }

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

          /**
          ?*?客戶端調(diào)用:天氣預(yù)報(bào)
          ?*?
          ?*?
          @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ù)報(bào): "
          );
          ????????System.out.println(
          " ------------ "
          );
          ????????earth.setWeather(
          " 臺(tái)風(fēng)‘珍珠’逼近 "
          );
          ????????earth.setWeather(
          " 大到暴雨 "
          );
          ????????earth.setWeather(
          " 天氣炎熱 "
          );
          ????}

          }

          [運(yùn)行結(jié)果]

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

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

          評(píng)論

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

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

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

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


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


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

          導(dǎo)航

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

          統(tǒng)計(jì)

          常用鏈接

          留言簿(15)

          隨筆分類

          隨筆檔案

          相冊(cè)

          收藏夾

          博客

          文檔

          站點(diǎn)

          論壇

          搜索

          積分與排名

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 陈巴尔虎旗| 凤阳县| 梓潼县| 庆云县| 大宁县| 枣庄市| 姜堰市| 蒲城县| 江津市| 田东县| 定安县| 黄冈市| 肥东县| 乡宁县| 兴安县| 洪湖市| 嘉峪关市| 禄丰县| 封丘县| 庆阳市| 新乡县| 绥德县| 泽州县| 洪泽县| 紫金县| 左贡县| 高阳县| 苏尼特右旗| 阳江市| 桂林市| 眉山市| 云南省| 和静县| 中阳县| 正镶白旗| 肥乡县| 汽车| 南郑县| 中方县| 兴隆县| 琼结县|