posts - 262,  comments - 221,  trackbacks - 0
          一、Observer模式的意圖:

          在對(duì)象的內(nèi)部狀態(tài)發(fā)生變化時(shí),自動(dòng)通知外部對(duì)象進(jìn)行響應(yīng)。

          二、Observer模式的構(gòu)成:

          ·被觀察者:內(nèi)部狀態(tài)有可能被改變,而且又需要通知外部的對(duì)象

          ·觀察者:需要對(duì)內(nèi)部狀態(tài)的改變做出響應(yīng)的對(duì)象

          三、Observer模式的Java實(shí)現(xiàn):

          Java的API中已經(jīng)為我們提供了Observer模式的實(shí)現(xiàn)。具體由java.util.Observable類和java.util.Observer接口完成。

          前者有兩個(gè)重要的方法:

          ·setChanged:設(shè)置內(nèi)部狀態(tài)為已改變

          ·notifyObservers(Object obj):通知觀察者所發(fā)生的改變,參數(shù)obj是一些改變的信息

          后者有一個(gè)核心方法:

          ·update(Object obj):相應(yīng)被觀察者的改變,其中obj就是被觀察者傳遞過來的信息,該方法會(huì)在notifyObservers被調(diào)用時(shí)自動(dòng)調(diào)用。

          下面是Observer模式的實(shí)現(xiàn)過程:

          ·創(chuàng)建一個(gè)被觀察者,繼承java.util.Observable

          ·創(chuàng)建一個(gè)觀察者,實(shí)現(xiàn)java.util.Observer接口

          ·注冊(cè)觀察著,調(diào)用addObserver(Observer observer)

          ·在被觀察者改變對(duì)象內(nèi)部狀態(tài)的地方,調(diào)用setChanged()方法,然后調(diào)用notifyObservers(Object)方法,通知被觀察者

          ·在觀察者的update(Object)方法中,對(duì)改變做出響應(yīng)。

          四、Observer模式的好處:

          1.Observer模式的優(yōu)點(diǎn):

             ·被觀察者只需要知道誰在觀察它,無需知道具體的觀察細(xì)節(jié)

             ·被觀察者一旦發(fā)生變化,只需要通過廣播的方式告知觀察者,至于消息如何到達(dá)則不需知道。這樣的話無疑消除了被觀察者和觀察者之間通信的硬編碼

             ·當(dāng)一個(gè)被觀察者同時(shí)被多個(gè)觀察著觀察時(shí),觀察者可以只選擇自己感興趣的事件,而忽略其它的事件
            
             ·多個(gè)觀察者組合起來可以形成一個(gè)觀察鏈,如果一旦需要回滾多個(gè)操作,此時(shí)觀察鏈可以發(fā)揮作用

             ·觀察者可以實(shí)時(shí)對(duì)被觀察對(duì)象的變化做出響應(yīng),例如自動(dòng)告警、中斷運(yùn)行等


          2.運(yùn)用Observer模式可以

             ·屏蔽線程間的通信機(jī)制:例如兩個(gè)線程之間,主線程可以作為觀察者,執(zhí)行線程是被觀察者。彼此之間只知道對(duì)方存在,但不知道之間通信的細(xì)節(jié)

             ·消除硬編碼:如果沒有Observer模式,則只能采用回調(diào)的模式,或者在代碼中顯示地調(diào)用觀察者

             ·優(yōu)化異常機(jī)制:特別適合在異常發(fā)生時(shí)向頂層監(jiān)控,減少try-catch代碼量



          -------------------------------------------------------------
          生活就像打牌,不是要抓一手好牌,而是要盡力打好一手爛牌。
          posted on 2008-03-07 13:55 Paul Lin 閱讀(3083) 評(píng)論(0)  編輯  收藏 所屬分類: 模式與重構(gòu)
          <2008年3月>
          2425262728291
          2345678
          9101112131415
          16171819202122
          23242526272829
          303112345

          常用鏈接

          留言簿(21)

          隨筆分類

          隨筆檔案

          BlogJava熱點(diǎn)博客

          好友博客

          搜索

          •  

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 阳信县| 陵川县| 齐齐哈尔市| 藁城市| 新平| 南澳县| 明星| 鄯善县| 和龙市| 迭部县| 泰州市| 五指山市| 格尔木市| 龙岩市| 湘乡市| 潢川县| 乐昌市| 平潭县| 汝州市| 大庆市| 长乐市| 四子王旗| 沧州市| 巴中市| 萍乡市| 长治县| 临漳县| 壤塘县| 鹿邑县| 交口县| 类乌齐县| 漳平市| 刚察县| 珲春市| 开阳县| 牡丹江市| 丹江口市| 格尔木市| 蛟河市| 临沂市| 龙陵县|