2004-08-31
構(gòu)建型模式和結(jié)構(gòu)型模式強(qiáng)調(diào)的都是靜態(tài)的類實(shí)體之間的關(guān)系,行為型模式著力解決的是類實(shí)體之間的通訊關(guān)系。希望以面向?qū)ο蟮姆绞矫枋鲆粋€(gè)控制流程。
以往的經(jīng)歷中大多是解決類實(shí)體的封裝問題,對(duì)于類之間的通訊方式上,并沒有刻意的去理解,所以有些行為型模式相對(duì)陌生。
還有一個(gè)原因就是行為型模式和面向過程的東西有很多近似之處,導(dǎo)致一定的理解的混淆。
從筆記就可以看出理解的不夠,可以再專門針對(duì)行為型模式做些細(xì)節(jié)的學(xué)習(xí)。
1 chain of responsibility(職責(zé)鏈)-行為型對(duì)象模式
這是個(gè)“請(qǐng)求”處理的模式。他提供一個(gè)思路,來解決“請(qǐng)求”在一組具有一定結(jié)構(gòu)的類之間傳遞時(shí)的問題,所以,我認(rèn)為這只是一種思路,一種將“請(qǐng)求”象鏈條一樣傳導(dǎo)出去的方式。他的具體傳遞方式,除了和鏈的設(shè)計(jì)有關(guān)之外,最重要的是和對(duì)象組的結(jié)構(gòu)有關(guān)。
當(dāng)然,如果沒有結(jié)構(gòu)的對(duì)象組,我們也可以強(qiáng)行的動(dòng)態(tài)構(gòu)建一個(gè)鏈,這種方式雖然復(fù)雜和略土,但肯定更加的靈活,不僅能控制處理,還能控制鏈的走向。
一般來看,composite模式和這種模式經(jīng)常在一起,Microsoft IE中的文檔事件模型應(yīng)該采用的就是這樣的模式。
2 command(命令)-行為型對(duì)象模式
將請(qǐng)求封裝為一個(gè)對(duì)象,從而可以對(duì)請(qǐng)求做一些統(tǒng)一性處理,如:排隊(duì)、日志、撤銷等。
適用性:
1、是回調(diào)機(jī)制的一個(gè)面向?qū)ο蟮奶娲?br />2、在不同時(shí)期指定、排列、和執(zhí)行請(qǐng)求
3、支持取消操作,但是,此處對(duì)象的狀態(tài)存儲(chǔ)是個(gè)麻煩的東西。
4、支持原語(yǔ)操作上構(gòu)建高層操作的系統(tǒng)。這種在支持“事務(wù)”的系統(tǒng)中很常見。
理解還是不很透徹
3、Iterator(迭代器)-行為型對(duì)象模式
將聚合類的遍歷算法封裝為Iterator,從而封裝對(duì)象的內(nèi)部表示。
Iterator分為外部和內(nèi)部,外部更加靈活,內(nèi)部傳入?yún)?shù)簡(jiǎn)單(只需要操作),內(nèi)部Iterator自動(dòng)遍歷所有元素。
Iterator可以封裝算法,也可以只記錄狀態(tài),由聚合類封裝算法,封裝算法的iterator可能會(huì)破壞聚合類的封裝性。
4、mediator(中介者)
mediator希望通過一個(gè)中控對(duì)象來完成對(duì)多個(gè)對(duì)象的關(guān)系的管理。
將多數(shù)可以可以重用的組件無關(guān)聯(lián)的構(gòu)建起來,而他們之間的關(guān)系由額外的對(duì)象來完成。
在圖形化編程里,可以用此模式和listener機(jī)制(observer模式)結(jié)合使用,更加方便,進(jìn)一步解除了中控對(duì)象與其他對(duì)象的耦合。
5、memento(備忘錄)/token
原發(fā)器(originator)(需要保存狀態(tài)的)申請(qǐng)一個(gè)備忘錄(memento),并自己將狀態(tài)保存進(jìn)去,然后,將備忘錄交給管理者(caretaker),當(dāng)出現(xiàn)需要的時(shí)候,管理者將合適的備忘錄交給原發(fā)器,原發(fā)器自己恢復(fù)自己的
狀態(tài)。
memento模式,從originator中分離了保存客戶請(qǐng)求狀態(tài)的過程。并且memento的存儲(chǔ)和解釋都是由originator完成,保證了封裝的邊界。
如果備忘錄的創(chuàng)建及其返回(給原發(fā)器)的順序是可預(yù)測(cè)的,備忘錄可以存儲(chǔ)增量改變。
6、observer(觀察者)/依賴(dependents)/發(fā)布-訂閱(Publish-Subject)
suject(目標(biāo))和observer(觀察者)是關(guān)鍵對(duì)象,suject和不固定的observer發(fā)生關(guān)系,將這種關(guān)系解耦是這個(gè)模式的主要功能,listener機(jī)制可以看作這種模式的一個(gè)實(shí)現(xiàn),當(dāng)然mvc也是這種模式的一個(gè)好的應(yīng)用場(chǎng)景。
與mediator的區(qū)別主要體現(xiàn)在,observer是一個(gè)對(duì)關(guān)聯(lián)關(guān)系的解耦過程,而mediator更加注重各個(gè)對(duì)象執(zhí)行的功能。
7、state(狀態(tài))/狀態(tài)對(duì)象(Objects for Status)
允許一個(gè)對(duì)象在改變其狀態(tài)的時(shí)候改變它的行為,使得對(duì)象似乎修改了自己的類。
1、將狀態(tài)相關(guān)的行為局部化。
2、狀態(tài)轉(zhuǎn)換顯式化
我們可以根據(jù)當(dāng)前窗口的狀態(tài)來轉(zhuǎn)變窗口的菜單和操作,這種方式可以用state模式來實(shí)現(xiàn)。
8、strategy(策略)
將算法單獨(dú)的封裝起來,使得它獨(dú)立于其他對(duì)象的變化。
其實(shí)這種方式和面向過程里的一個(gè)算法函數(shù)封裝基本是一樣的,只是由于封裝成為了類,會(huì)有一些接口統(tǒng)一的便于替換的特性。
9、visitor(訪問者)
這種模式的主要目的是分離操作和對(duì)象,追求的是對(duì)象的重用和簡(jiǎn)單,以及操作的可替代性。
相對(duì)來說,strategy模式更加追求的是封裝操作,追求操作的重用性。
observer、mediator追求分離對(duì)象之間的關(guān)系與對(duì)象本身。
以上都是對(duì)象級(jí)別的行為模式,以下是類級(jí)別的行為模式
1、template(模板)
定義一個(gè)算法的骨架,并將其中一些步驟延遲到子類中。
這種使用較多,不多說了。
2、interpreter(解釋器)
本模式描述了如何為簡(jiǎn)單的語(yǔ)言定義一個(gè)文法,如何在該語(yǔ)言中表示一個(gè)句子,以及如何解釋這些句子。
這種方式在正則表達(dá)式中比較明顯,在以往的程序應(yīng)用中,特別是上層應(yīng)用中很少用到。
expression::= literal | alternation | sequence | repetition | '(' expression ')'
alternation ::= expression '|' expression
sequence ::= expression '&' expression
repetition ::= expression '*'
literal ::= 'a'|'b'|...{'a'|'b'|...}*
相關(guān)的關(guān)鍵參與者為:
1、abstractExpression(抽象表達(dá)式,統(tǒng)一的接口)
2、terminalExpression(終結(jié)符表達(dá)式)
3、nonterminalExpression(非終結(jié)符表達(dá)式)