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(非終結符表達式)