應用,一定要應用

          BlogJava 首頁 新隨筆 聯系 聚合 管理
            25 Posts :: 0 Stories :: 118 Comments :: 0 Trackbacks

          2004-08-31

          構建型模式和結構型模式強調的都是靜態的類實體之間的關系,行為型模式著力解決的是類實體之間的通訊關系。希望以面向對象的方式描述一個控制流程。
          以往的經歷中大多是解決類實體的封裝問題,對于類之間的通訊方式上,并沒有刻意的去理解,所以有些行為型模式相對陌生。
          還有一個原因就是行為型模式和面向過程的東西有很多近似之處,導致一定的理解的混淆。
          從筆記就可以看出理解的不夠,可以再專門針對行為型模式做些細節的學習。

          1 chain of responsibility(職責鏈)-行為型對象模式
          這是個“請求”處理的模式。他提供一個思路,來解決“請求”在一組具有一定結構的類之間傳遞時的問題,所以,我認為這只是一種思路,一種將“請求”象鏈條一樣傳導出去的方式。他的具體傳遞方式,除了和鏈的設計有關之外,最重要的是和對象組的結構有關。
          當然,如果沒有結構的對象組,我們也可以強行的動態構建一個鏈,這種方式雖然復雜和略土,但肯定更加的靈活,不僅能控制處理,還能控制鏈的走向。

          一般來看,composite模式和這種模式經常在一起,Microsoft IE中的文檔事件模型應該采用的就是這樣的模式。

          2 command(命令)-行為型對象模式
          將請求封裝為一個對象,從而可以對請求做一些統一性處理,如:排隊、日志、撤銷等。
          適用性:
          1、是回調機制的一個面向對象的替代品
          2、在不同時期指定、排列、和執行請求
          3、支持取消操作,但是,此處對象的狀態存儲是個麻煩的東西。
          4、支持原語操作上構建高層操作的系統。這種在支持“事務”的系統中很常見。
          理解還是不很透徹

          3、Iterator(迭代器)-行為型對象模式
          將聚合類的遍歷算法封裝為Iterator,從而封裝對象的內部表示。
          Iterator分為外部和內部,外部更加靈活,內部傳入參數簡單(只需要操作),內部Iterator自動遍歷所有元素。
          Iterator可以封裝算法,也可以只記錄狀態,由聚合類封裝算法,封裝算法的iterator可能會破壞聚合類的封裝性。

          4、mediator(中介者)
          mediator希望通過一個中控對象來完成對多個對象的關系的管理。
          將多數可以可以重用的組件無關聯的構建起來,而他們之間的關系由額外的對象來完成。
          在圖形化編程里,可以用此模式和listener機制(observer模式)結合使用,更加方便,進一步解除了中控對象與其他對象的耦合。

          5、memento(備忘錄)/token
          原發器(originator)(需要保存狀態的)申請一個備忘錄(memento),并自己將狀態保存進去,然后,將備忘錄交給管理者(caretaker),當出現需要的時候,管理者將合適的備忘錄交給原發器,原發器自己恢復自己的
          狀態。
          memento模式,從originator中分離了保存客戶請求狀態的過程。并且memento的存儲和解釋都是由originator完成,保證了封裝的邊界。
          如果備忘錄的創建及其返回(給原發器)的順序是可預測的,備忘錄可以存儲增量改變。

          6、observer(觀察者)/依賴(dependents)/發布-訂閱(Publish-Subject)
          suject(目標)和observer(觀察者)是關鍵對象,suject和不固定的observer發生關系,將這種關系解耦是這個模式的主要功能,listener機制可以看作這種模式的一個實現,當然mvc也是這種模式的一個好的應用場景。
          與mediator的區別主要體現在,observer是一個對關聯關系的解耦過程,而mediator更加注重各個對象執行的功能。

          7、state(狀態)/狀態對象(Objects for Status)
          允許一個對象在改變其狀態的時候改變它的行為,使得對象似乎修改了自己的類。
          1、將狀態相關的行為局部化。
          2、狀態轉換顯式化

          我們可以根據當前窗口的狀態來轉變窗口的菜單和操作,這種方式可以用state模式來實現。

          8、strategy(策略)
          將算法單獨的封裝起來,使得它獨立于其他對象的變化。
          其實這種方式和面向過程里的一個算法函數封裝基本是一樣的,只是由于封裝成為了類,會有一些接口統一的便于替換的特性。

          9、visitor(訪問者)
          這種模式的主要目的是分離操作和對象,追求的是對象的重用和簡單,以及操作的可替代性。
          相對來說,strategy模式更加追求的是封裝操作,追求操作的重用性。
          observer、mediator追求分離對象之間的關系與對象本身。


          以上都是對象級別的行為模式,以下是類級別的行為模式
          1、template(模板)
          定義一個算法的骨架,并將其中一些步驟延遲到子類中。
          這種使用較多,不多說了。

          2、interpreter(解釋器)
          本模式描述了如何為簡單的語言定義一個文法,如何在該語言中表示一個句子,以及如何解釋這些句子。
          這種方式在正則表達式中比較明顯,在以往的程序應用中,特別是上層應用中很少用到。
          expression::= literal | alternation | sequence | repetition | '(' expression ')'
          alternation ::= expression '|' expression
          sequence ::= expression '&' expression
          repetition ::= expression '*'
          literal ::= 'a'|'b'|...{'a'|'b'|...}*

          相關的關鍵參與者為:
          1、abstractExpression(抽象表達式,統一的接口)
          2、terminalExpression(終結符表達式)
          3、nonterminalExpression(非終結符表達式)

          posted on 2006-08-24 17:10 flyffa 閱讀(1180) 評論(0)  編輯  收藏 所屬分類: 讀書
          主站蜘蛛池模板: 焉耆| 阿巴嘎旗| 巴林左旗| 鄂尔多斯市| 攀枝花市| 邯郸市| 福清市| 祁东县| 山西省| 叙永县| 商南县| 富平县| 双牌县| 惠来县| 博兴县| 郎溪县| 鄂托克旗| 吉木乃县| 连平县| 高密市| 宝丰县| 景东| 大渡口区| 临泉县| 吴堡县| 绥棱县| 浪卡子县| 东平县| 莎车县| 虎林市| 开阳县| 铁岭市| 资中县| 楚雄市| 本溪| 山东| 兰西县| 巴马| 新和县| 江口县| 崇阳县|