<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆 - 4  文章 - 4  trackbacks - 0
    <2007年3月>
    25262728123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    常用鏈接

    留言簿(1)

    隨筆分類

    隨筆檔案

    文章分類

    收藏夾

    Design Patterns

    Ebook

    Eclipse

    Good Blog

    Good IT WebSite

    Java

    Linux

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    GOF的設計模式中是這樣描述Observer模式的意圖(intent)的:
    定義對象間的一種一對多的依賴關系,當一個對象的狀態發生改變時,所有依賴于它的對象都得到通知并被自動更新。

    我自己的理解是:
    ??????? Observer模式定義了一種多個對象之間的一對多的相互依賴關系,當一個對象的狀態發生改變時,其他與之有關系的對象“看上去”都要相應采取行動。


    試著用Observer模式寫了一些代碼,模擬灌籃比賽,運動員每次灌完之后,評委為他們打分。
    在這里Player是Subject;
    ChinesePlayer和USPlayer是ConcreteSubject;
    Rater是Observer
    DunkRater是ConcreteObserver

    Player中的endPlaying方法就是Player的行為或(引起觀察者行為的)事件。
    Rater中的rate方法是觀察者的響應行為。???????????

    ?????????


    某一次打印出的結果如下:
    Yao Ming have a power dunk
    Kobe: 4
    Jordan: 4
    James have a highflyer dunk
    Kobe: 7
    Jordan: 5

    ??
    ?幾點討論:

    1)在Player(Subject)中的那個raterList是否可以把private改為protected?
    ?? 我覺得改了不好,因為不應該把“用什么數據結構、何種方式保存Rater(Observer)”暴露給用戶。(客戶程序員,他們可以擴展Player這個抽象類),否則就違背了封裝性。

    2)從面向對象的幾個原則來看Observer模式
    ??? a)把變化的部分封裝起來:
    ?????? 我們可以很好地擴展Player和Rater兩個部分,彼此沒有過多影響。因此Observer模式在方面做的還是很好的。
    ????? ConcretePlayer與ConcreteRater這間的聯系就是ConcretePlayer維護著一個注冊過的現有的Rater(Observer)的列表(這個列表的實現方式對于負責擴展地程序員應該是透明的),ConcretePlayer不知道它的監聽者具體是什么類型,只知道它們實現了Rater(Observer)的接口。
    ???????

    ??? b)面向接口編程而不是面向實現
    ????? 在客戶主程序中,只出現了三個具體的類,這樣的問題可以通過工廠模式解決。
    ????? 值得注意的一點,也是Head First in Design Patterns中對于這條原則的一個解釋:
    ??????一直以來我們所說的面向對象設計中很重要的一條原則--面向接口編程,再加之繼承存在的種種問題,容易使人產生錯覺:使用關鍵字interface。
    ????? 實際上這條原則的一個等價的說法是“面向SuperType編程”。這里的SuperType的意思是接口或者超類。
    ????? 因此用abstract class并沒有違反這樣的原則,反而是遵守了。

    3)語義上與實現上是否是相反的
    ???我不明白是翻譯問題還是我自己沒懂,總覺得GOF的描述中“自動”二字和“觀察者”會給讀者帶來誤解。
    ???原因如下:
    ??????? Observer模式描述的是這樣的一種情況:
    ????????當一個Subject的狀態發生變化或被觸發了一個事件的時候,在這個Subject上注冊的對象要依據這樣的變化或事件做出相應的反映,這些對象然后被稱之為Observers。
    ????????按照GOF的說法,從語義上來說應該是Observer主動響應了這個行為。
    ??????? 但在實現上應該是Subject調用Observer的這個響應行為,這就是我上面所說的“看上去”主動響應,實際上是被動地被Subject調用。
    ??????? 因此Observer和自動不免給人帶來誤解,站在Subject的角度上給這個模式取名,叫作通知者模式也許更好。
    ????????
    ????????
    ??????? 這個例子,以后會重構,將其他模式應用上去。在網上學習的過程中,知道Observer模式和責任鏈模式、MVC模式會有組合,但我現在還沒有學到,就先寫這些吧。
    ????????

    ???????


    ??????
    ??
    ?



    ????????
    ???????
    ?????????
    ?

    posted on 2007-03-04 06:50 冰雪荒原 閱讀(1206) 評論(3)  編輯  收藏 所屬分類: 設計模式

    FeedBack:
    # re: Observer模式 學習筆記 2007-03-04 08:38 lang
    這么早起來寫東西啊!真是勤奮 啊!向你致敬!  回復  更多評論
      
    # re: Observer模式 學習筆記 2007-03-04 10:18 冰雪荒原
    呵呵,睡不著而已。
    今天學校要注冊了,明天就要開學了~  回復  更多評論
      
    # re: Observer模式 學習筆記1 2007-03-04 16:42 Druze.libo
    學校真好!  回復  更多評論
      

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


    網站導航:
     
    主站蜘蛛池模板: 亚洲欧美日本韩国| 亚洲电影免费观看| 黄页免费视频播放在线播放| 最近最新MV在线观看免费高清| 久久亚洲美女精品国产精品 | 亚洲AV无码精品色午夜果冻不卡| 亚洲精品偷拍视频免费观看| 亚洲精品国产精品乱码不卞| 四虎永久在线精品免费一区二区| 免费吃奶摸下激烈视频| 黄色三级三级免费看| 亚洲精品成人区在线观看| 成人免费乱码大片A毛片| 久久精品7亚洲午夜a| 免费在线观看视频网站| 亚洲人成人77777网站不卡| 人妻视频一区二区三区免费| 亚洲第一第二第三第四第五第六 | free哆啪啪免费永久| 亚洲综合色7777情网站777| 日本一道高清不卡免费| 免费无码又爽又黄又刺激网站| 国产亚洲?V无码?V男人的天堂| 91成人免费福利网站在线| 亚洲欧洲第一a在线观看| 性做久久久久久免费观看| 国产亚洲综合视频| 亚洲国产精品无码成人片久久| 成人免费视频网站www| 大桥未久亚洲无av码在线| 在线观看国产区亚洲一区成人 | 亚洲国产精品自产在线播放| 成人A毛片免费观看网站| 久久久久亚洲精品日久生情| 成年女人免费视频播放77777| 视频免费1区二区三区| 亚洲视频在线免费看| 人人狠狠综合久久亚洲高清| 久久久久久成人毛片免费看| 亚洲日韩国产二区无码 | 亚洲另类图片另类电影|