夢幻之旅

          DEBUG - 天道酬勤

             :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            671 隨筆 :: 6 文章 :: 256 評論 :: 0 Trackbacks
          <2011年7月>
          262728293012
          3456789
          10111213141516
          17181920212223
          24252627282930
          31123456

          公告

          本博客中未注原創(chuàng)的文章均為轉(zhuǎn)載,對轉(zhuǎn)載內(nèi)容可能做了些修改和增加圖片注釋,如果侵犯了您的版權(quán),或沒有注明原作者,請諒解

          常用鏈接

          留言簿(21)

          隨筆分類(644)

          隨筆檔案(669)

          文章檔案(6)

          最新隨筆

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          觀察者模式:
              定義對象是一種一對多的關(guān)系,當(dāng)一這方的狀態(tài)發(fā)生變化時,多的之方需要得到通知或更新.
          觀察者模式包含以下幾個部份:
              a.主題接口, 此接口是定義一之方的功能,此接口至少應(yīng)該包含兩個方法:
                1.添加觀察者
                2.通知觀察者
              b.主題接口實現(xiàn)類
              c.觀察者接口,此接口定義多方的功能,至少應(yīng)該包含以下功能
              d.觀察者實現(xiàn)類

          觀察者模式的UML圖:
                

          觀察者與后繼動作

              對于觀察者而言,除了監(jiān)視被觀察對象之外,更重要的是當(dāng)發(fā)現(xiàn)被觀察對象發(fā)生改變時應(yīng)該采取什么樣的動作,比如在學(xué)校教務(wù)系統(tǒng)中,HeadMaster一旦注意到有新的學(xué)生信息被保存成功時,就會調(diào)用sendMail方法發(fā)送一封郵件到校長的郵箱中,我們把諸如此類的動作稱為后繼動作。對于觀察者而言,其后繼動作可以分為兩類:基于“推數(shù)據(jù)”的后繼動作和基于“拉數(shù)據(jù)”的后繼動作。
             A.推數(shù)據(jù)
              所謂“推數(shù)據(jù)”,即當(dāng)被觀察對象發(fā)生變化時,它將把相關(guān)的變化數(shù)據(jù)以參數(shù)的形式傳給被觀察者。比如,在學(xué)校教務(wù)系統(tǒng)的觀察者模式中,我們使用的就是基于“推數(shù)據(jù)”的后繼動作。當(dāng)StudentBean的當(dāng)前對象被保存到數(shù)據(jù)庫后,該對象將作為參數(shù)被傳入到update方法中,作為觀察者的HeadMaster將從update方法的參數(shù)中得到需要的數(shù)據(jù),形象一點來說,數(shù)據(jù)是由被觀察者“推”給觀察者的。

                 基于“推數(shù)據(jù)”的后繼動作的優(yōu)點在于觀察者一方無需考慮數(shù)據(jù)是如何得到的,只需對得到的數(shù)據(jù)進行相應(yīng)的處理即可。此時,觀察者與被觀察者之間幾乎沒有什么耦合。

          基于“推數(shù)據(jù)”的后繼動作的缺點在于觀察者獲得數(shù)據(jù)的形式是被動的,對于同一個觀察對象而言,不同觀察者想要獲得的數(shù)據(jù)很有可能是不同的,但此時他們將不得不接受由參數(shù)傳入的一些與自己沒有關(guān)系的數(shù)據(jù)。比如,在學(xué)校教務(wù)系統(tǒng)中,校長可能只想得到學(xué)生的學(xué)歷信息,而教務(wù)主任只想得到學(xué)生的交費信息,但他們將不得不接受一些與己無關(guān)的額外信息。此外,若方法update的參數(shù)發(fā)生變化也會對不同觀察者的后繼動作造成一些影響。
              B.拉數(shù)據(jù)
              所謂“拉數(shù)據(jù)”,即當(dāng)被觀察對象發(fā)生變化時,不是由被觀察者把數(shù)據(jù)傳給觀察者,而是由觀察者主動到被觀察對象中來取得數(shù)據(jù)。形象一點來說,數(shù)據(jù)是由觀察者主動到被觀察者中來“拉” 的。當(dāng)然,此時在被觀察的對象或接口中需要提供一些方法來供觀察者“拉”,同時在觀察者對象中也需提供一個對被觀察對象的引用的屬性,由此也造成了觀察者與被觀察者之間一定程度的耦合。


          觀察者模式的效果有以下幾個優(yōu)點:

                 (1)觀察者模式在被觀察者和觀察者之間建立一個抽象的耦合。被觀察者角色所知道的只是一個具體現(xiàn)察者聚集,每一個具體現(xiàn)察者都符合一個抽象觀察者的接口。被觀察者并不認識任何一個具體觀察者,它只知道它們都有一個共同的接口。由于被觀察者和觀察者沒有緊密地耦合在一起,因此它們可以屬于不同的抽象化層次。

                 (2)觀察者模式支持廣播通信。被觀察者會向所有的登記過的觀察者發(fā)出通知。
           觀察者模式有下面的一些缺點:

                 (1)如果一個被觀察者對象有很多直接和間接的觀察者的話,將所有的觀察者都通知到會花費很多時間。

                 (2)如果在被觀察者之間有循環(huán)依賴的話,被觀察者會觸發(fā)它們之間進行循環(huán)調(diào)用,導(dǎo)致系統(tǒng)崩潰。在使用觀察考模式時要特別注意這一點。

                 (3)如果對觀察者的通知是通過另外的線程進行異步投遞的話,系統(tǒng)必須保證投遞是以自恰的方式進行的。

                 (4)雖然觀察者模式可以隨時使觀察者知道所觀察的對象發(fā)生了變化,但是觀察者模式?jīng)]有相應(yīng)的機制使觀察者知道所觀察的對象是怎么發(fā)生變化的。


          posted on 2011-07-27 01:05 HUIKK 閱讀(256) 評論(0)  編輯  收藏 所屬分類: Design Patterns
          主站蜘蛛池模板: 舒城县| 湘潭市| 蒙阴县| 襄垣县| 合江县| 郸城县| 黄骅市| 江永县| 靖边县| 陵川县| 班戈县| 高唐县| 沧州市| 平遥县| 丹阳市| 宝应县| 通化县| 辽宁省| 松原市| 厦门市| 临江市| 河东区| 夏河县| 扶沟县| 浑源县| 黑水县| 郴州市| 万年县| 文化| 郓城县| 大石桥市| 宁晋县| 资中县| 明星| 龙岩市| 施秉县| 武威市| 鄂托克前旗| 嘉义县| 黑龙江省| 西吉县|