軟件工程的23種設(shè)計(jì)模式的UML類(lèi)圖_第1頁(yè)
軟件工程的23種設(shè)計(jì)模式的UML類(lèi)圖_第2頁(yè)
軟件工程的23種設(shè)計(jì)模式的UML類(lèi)圖_第3頁(yè)
軟件工程的23種設(shè)計(jì)模式的UML類(lèi)圖_第4頁(yè)
軟件工程的23種設(shè)計(jì)模式的UML類(lèi)圖_第5頁(yè)
已閱讀5頁(yè),還剩12頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、二 十三種設(shè)計(jì)模式0 引言談到設(shè)計(jì)模式,絕對(duì)應(yīng)該一起來(lái)說(shuō)說(shuō)重構(gòu)。重構(gòu)給我們帶來(lái)了什么?除了作為對(duì)遺留代碼的改進(jìn)的方法,另一 大意義在于,可以讓我們?cè)趯?xiě)程序的時(shí)候可以不需事先考慮太多的代碼組織問(wèn)題,當(dāng)然這其中也包括了應(yīng)用模式的問(wèn)題。盡管大多數(shù)開(kāi)發(fā)者都已經(jīng)養(yǎng)成了寫(xiě)代碼前先 從設(shè)計(jì)開(kāi)始的習(xí)慣,但是,這種程度的設(shè)計(jì),涉及到到大局、到總體架構(gòu)、到主要的模塊劃分我覺(jué)得就夠了。換句話說(shuō),這時(shí)就能寫(xiě)代碼了。這就得益于重構(gòu)的思想 了。如果沒(méi)有重構(gòu)的思想,有希望獲得非常高質(zhì)量的代碼,我們就不得不在開(kāi)始寫(xiě)代碼前考慮更多其實(shí)并非非常穩(wěn)定的代碼組織及設(shè)計(jì)模式的應(yīng)用問(wèn)題,那開(kāi)發(fā)效率 當(dāng)然就大打折扣了。在重構(gòu)和設(shè)計(jì)模式的合

2、理應(yīng)用之下,我們可以相對(duì)較早的開(kāi)始寫(xiě)代碼,并在功能盡早實(shí)現(xiàn)的同時(shí),不斷地通過(guò)重構(gòu)和模式來(lái)改善我們的代碼質(zhì) 量。所以,下面的章節(jié)中,在談模式的同時(shí),我也會(huì)談?wù)勱P(guān)于常用的這些模式的重構(gòu)成本的理解。重構(gòu)成本越高意味著,在遇到類(lèi)似的問(wèn)題情形的時(shí)候,我們更應(yīng)該 提前考慮應(yīng)用對(duì)應(yīng)的設(shè)計(jì)模式,而重構(gòu)成本比較低則說(shuō)明,類(lèi)似的情形下,完全可以先怎么方便,怎么快怎么寫(xiě),哪怕代碼不是很優(yōu)雅也沒(méi)關(guān)系,回頭再重構(gòu)也很容 易。1 創(chuàng)建型1.1FactoryMethod思想:Factory Method的主要思想是使一個(gè)類(lèi)的實(shí)例化延遲到其子類(lèi)。場(chǎng)景:典 型的應(yīng)用場(chǎng)景如:在某個(gè)系統(tǒng)開(kāi)發(fā)的較早階段,有某些類(lèi)的實(shí)例化過(guò)程,實(shí)例化

3、方式可能還不是很確定,或者實(shí)際實(shí)例化的對(duì)象(可能是需要對(duì)象的某個(gè)子類(lèi)中的一 個(gè))不確定,或者比較容易變化。此時(shí),如果直接將實(shí)例化過(guò)程寫(xiě)在某個(gè)函數(shù)中,那么一般就是if-else或select-case代 碼。如果,候選項(xiàng)的數(shù)目較少、類(lèi)型基本確定,那么這樣的if-else還是可以接受的,一旦情形變 得復(fù)雜、不確定性增加,更甚至包含這個(gè)構(gòu)造過(guò)程的函數(shù)所在的類(lèi)包含幾個(gè)甚至更多類(lèi)似的函數(shù)時(shí),這樣的if-else代 碼就會(huì)變得比較不那么容易維護(hù)了。此時(shí),應(yīng)用本模式,可以將這種復(fù)雜情形隔離開(kāi),即將這類(lèi)不確定的對(duì)象的實(shí)例化過(guò)程延遲到子類(lèi)。實(shí)現(xiàn):該模式的典型實(shí)現(xiàn)方法就是將調(diào)用類(lèi)定義為一個(gè)虛類(lèi),在調(diào)用類(lèi)定義一個(gè)專

4、門(mén)用于構(gòu)造不確定的對(duì)象實(shí)例的虛函數(shù),再將實(shí)際的對(duì)象實(shí)例化代碼 留到調(diào)用類(lèi)的子類(lèi)來(lái)實(shí)現(xiàn)。如果,被構(gòu)造的對(duì)象比較復(fù)雜的話,同時(shí)可以將這個(gè)對(duì)象定義為可以繼承、甚至虛類(lèi),再在不同的調(diào)用類(lèi)的子類(lèi)中按需返回被構(gòu)造類(lèi)的子 類(lèi)。重構(gòu)成本:低。該模式的重構(gòu)成本實(shí)際上還與調(diào)用類(lèi)自己的實(shí)例化方式相關(guān)。如果調(diào)用類(lèi)是通過(guò)Factory方 式(此處“Factory方式”泛指對(duì)象的實(shí)例化通過(guò)Factory Method或Abstract Factory這樣的相對(duì)獨(dú)立出來(lái)的 方式構(gòu)造)構(gòu)造的,那么,重構(gòu)成本相對(duì)就會(huì)更低。否則,重構(gòu)時(shí)可能除了增加調(diào)用類(lèi)的子類(lèi),還要將所有實(shí)例化調(diào)用類(lèi)的地方,修改為以新增的子類(lèi)代替。可能這 樣的子

5、類(lèi)還不止一個(gè),那就可以考慮迭代應(yīng)用模式來(lái)改善調(diào)用類(lèi)的實(shí)例化代碼。1.2AbstractFactory思想:不直接通過(guò)對(duì)象的具體實(shí)現(xiàn)類(lèi),而是通過(guò)使用專門(mén)的類(lèi)來(lái)負(fù)責(zé)一組相關(guān)聯(lián)的對(duì)象的創(chuàng)建。場(chǎng)景:最典型的應(yīng)用場(chǎng)景是:您只想暴露對(duì)象的接口而不想暴露具體的實(shí)現(xiàn)類(lèi),但是又想提供實(shí)例化對(duì)象的接口給用戶;或者,您希望所有的對(duì)象能夠 集中在一個(gè)或一組類(lèi)(通常稱作工廠類(lèi))來(lái)創(chuàng)建,從而可以更方便的對(duì)對(duì)象的實(shí)例化過(guò)程進(jìn)行動(dòng)態(tài)配置(此時(shí)只需要修改工廠類(lèi)的代碼或配置)。實(shí)現(xiàn):該模式的實(shí)現(xiàn)是比較清晰簡(jiǎn)單的,如上圖,就是定義創(chuàng)建和返回各種類(lèi)對(duì)象實(shí)例的工廠類(lèi)。在最復(fù)雜而靈活的情形,無(wú)論工廠類(lèi)本身還是被創(chuàng)建 的對(duì)象類(lèi)都可能需要有

6、一個(gè)繼承體系。簡(jiǎn)單情形其實(shí)可以只是一個(gè)工廠類(lèi)和需要被創(chuàng)建的對(duì)象類(lèi)。不一定非要像上圖中結(jié)構(gòu)那么完備(累贅)。重構(gòu)成本:中。如果一開(kāi)始所有的對(duì)象都是直接創(chuàng)建,例如通過(guò)new實(shí)例化的, 而之后想重構(gòu)為Abstract Factory模式,那么,很自然的我們需要替換所有直接的new實(shí) 例化代碼為對(duì)工廠類(lèi)對(duì)象創(chuàng)建方法的調(diào)用??紤]到像Resharper這樣的重構(gòu)工具的支持,找出對(duì) 某個(gè)方法或構(gòu)造函數(shù)的調(diào)用位置這樣的操作相對(duì)還是比較容易,重構(gòu)成本也不是非常高。同時(shí),重構(gòu)成本還和被創(chuàng)建對(duì)象的構(gòu)造函數(shù)的重載數(shù)量相關(guān)。您需要根據(jù)實(shí) 際情況考慮,是否工廠類(lèi)要映射被創(chuàng)建對(duì)象的所有重載版本的構(gòu)造函數(shù)。1.3Builde

7、r思想:將一個(gè)類(lèi)的創(chuàng)建過(guò)程和他的主體部分分離。場(chǎng)景:該模式的典型的應(yīng)用場(chǎng)景是:一個(gè)類(lèi)的創(chuàng)建過(guò)程可能比較復(fù)雜,或者創(chuàng)建過(guò)程中的某些階段可能會(huì)容易變化;或者多個(gè)類(lèi)的創(chuàng)建過(guò)程比較類(lèi)似, 但是主體不同。實(shí)現(xiàn):在 以上提到的兩種場(chǎng)景中,我們就可以取出一個(gè)類(lèi)的創(chuàng)建過(guò)程的代碼,定義一個(gè)專門(mén)的Builder類(lèi), 而在原來(lái)創(chuàng)建類(lèi)對(duì)象實(shí)例的地方,將這個(gè)Builder類(lèi)的實(shí)例作為參數(shù)傳入。還有第二個(gè)重點(diǎn),就是Builder類(lèi) 可以將將整個(gè)創(chuàng)建過(guò)程分為幾個(gè)階段,每個(gè)階段不必在類(lèi)中直接實(shí)現(xiàn),而可以通過(guò)繼承體系在子類(lèi)中實(shí)現(xiàn),或者通過(guò)子類(lèi)的方法過(guò)載來(lái)修改創(chuàng)建過(guò)程中的某個(gè)階段, 但是重用其他的階段??梢园l(fā)現(xiàn),該模式將一個(gè)對(duì)象

8、的復(fù)雜創(chuàng)建過(guò)程重用到非常高的層次。這正是它的意義所在。重構(gòu)成本:低。該模式的重構(gòu)成本我覺(jué)得是非常低的,因?yàn)橐话銇?lái)講,創(chuàng)建過(guò)程的代碼本來(lái)也就應(yīng)該在原來(lái)的類(lèi)的構(gòu)造函數(shù)中,把它Extract出 來(lái)就好了。如果發(fā)現(xiàn)多個(gè)類(lèi)的創(chuàng)建過(guò)程有比較多的代碼重復(fù)或類(lèi)似,那么就可以重用這些提取出來(lái)的Builder類(lèi) 或者Builder類(lèi)中的某些階段。1.4Prototype思想:克 隆一個(gè)已有的類(lèi)的實(shí)例(大家相比都用過(guò)甚至寫(xiě)過(guò)類(lèi)的Clone實(shí)現(xiàn),應(yīng)該很容易理解了)。場(chǎng)景:應(yīng) 用Clone的場(chǎng)景應(yīng)該說(shuō)非常多,理想情況下我當(dāng)然希望任何類(lèi)都能Clone, 需要的時(shí)候就能Clone一份一模一樣的出來(lái)。實(shí)現(xiàn):這 里將的實(shí)現(xiàn)主要

9、之實(shí)現(xiàn)的表現(xiàn)形式,而不是如何用具體的語(yǔ)言來(lái)實(shí)現(xiàn)。因此,只要為需要Clone能力 的類(lèi)定義一個(gè)Clone方法就行。當(dāng)然,一般,主流的程序語(yǔ)言框架都已經(jīng)定義了通用的Clone接 口(當(dāng)然也可以自己定義),繼承并實(shí)現(xiàn)該接口和方法就好。重構(gòu)成本:極低。不多解釋了吧。1.5 Singleton思想:保證一個(gè)類(lèi)只有一個(gè)唯一的實(shí)例。場(chǎng)景:生活中有些對(duì)象就是只要一個(gè)就好了,我們的代碼中為什么要每次都為這樣的對(duì)象生成一個(gè)實(shí)例呢?實(shí)現(xiàn):最 簡(jiǎn)單的實(shí)現(xiàn)方式就是使用一個(gè)static型的類(lèi)實(shí)例,每次對(duì)該對(duì)象的創(chuàng)建請(qǐng)求都返回這個(gè)static的 唯一實(shí)例就行。重構(gòu)成本:極低。2 結(jié)構(gòu)型2.1Adapter思想:將一個(gè)類(lèi)的接

10、口轉(zhuǎn)換成另外一個(gè)接口,使得原本由于接口不兼容而不能一起工作的那些類(lèi)可以一起工作。場(chǎng)景:該 模式的應(yīng)用場(chǎng)景太多了,很多需要的功能模塊的接口和我們需要的不完全一致或者有多余或不足,但是需要和我們的系統(tǒng)協(xié)同工作,通過(guò)Adapter把 它包裝一下就能讓使它接口兼容了。實(shí)現(xiàn):定 義一個(gè)Adapter類(lèi),包含需要包裝的類(lèi),實(shí)現(xiàn)需要的其它接口,調(diào)用被包裝的類(lèi)的方法來(lái)實(shí)現(xiàn)需要 的接口。重構(gòu)成本:低。2.2Bridge思想:將一個(gè)類(lèi)的抽象定義和具體實(shí)現(xiàn)解耦。場(chǎng)景:該 模式的典型應(yīng)用場(chǎng)景是:一個(gè)類(lèi)的抽象定義已經(jīng)確定,但是,其實(shí)現(xiàn)代碼甚至原理可能會(huì)不同。比如:我們最熟悉的圖形界面中的window的 實(shí)現(xiàn),無(wú)論在什么

11、操作系統(tǒng),什么平臺(tái)的機(jī)器上,一個(gè)window應(yīng)具有的抽象定義基本上是一致的, 但是,其實(shí)現(xiàn)代碼肯定會(huì)因?yàn)槠脚_(tái)不同,機(jī)器的代碼指令不同而不同。此時(shí),如果希望您寫(xiě)的window類(lèi) 能跨平臺(tái),應(yīng)用Bridge模式就是一個(gè)好主意。實(shí)現(xiàn):該 模式的實(shí)現(xiàn)方法很簡(jiǎn)單,就是除了定義類(lèi)的抽象定義之外,將一個(gè)類(lèi)的所有實(shí)現(xiàn)代碼獨(dú)立出一個(gè)實(shí)現(xiàn)類(lèi)。這樣一來(lái),無(wú)論是抽象定義還是實(shí)現(xiàn)類(lèi)都能分別修改和重 用,但只要兩部分的交互接口不變,還是可以方便的互相組裝。當(dāng)然,實(shí)際上也沒(méi)有必要隔離出“所有實(shí)現(xiàn)代碼”,只需要隔離需要的部分就行了。因此,也可以 說(shuō),從代碼結(jié)構(gòu)來(lái)看,Builder模式是一種變種的Bridge模 式的。也經(jīng)常有

12、人將Bridge模式和接口相比較,如果隔離出所有的實(shí)現(xiàn),那么的確接口的方式也能 做到抽象定義和實(shí)現(xiàn)分離,但是,Bridge有其優(yōu)勢(shì)如下:一、究竟隔離多少代碼到Bridge類(lèi) 中可以靈活確定,二、減少了總的類(lèi)的數(shù)目,三、允許被隔離出來(lái)的Bridge類(lèi)被其它的類(lèi)直接共享 使用。重構(gòu)成本:中。將所有的(或很大部分)實(shí)現(xiàn)代碼分離開(kāi)來(lái)總還是一件不大,但是,也不小的事。所以標(biāo)個(gè)“中”在這里。:)2.3Composite思想:將 對(duì)象組合成樹(shù)形結(jié)構(gòu)以表示“部分-整體”的層次結(jié)構(gòu),使得用戶對(duì)單個(gè)對(duì)象和組合對(duì)象的使用具有一致 性。場(chǎng)景:該 模式的應(yīng)用場(chǎng)景極其類(lèi)似,比如像圖形系統(tǒng),如電路設(shè)計(jì)、UML建模系統(tǒng),或者

13、像web的 顯示元素等,都是那種需要整體和部分具有使用接口上的一定的一致性的需求的結(jié)構(gòu),實(shí)際上,我覺(jué)得這樣的系統(tǒng)如果不使用Composite模 式將會(huì)是慘不忍睹的。實(shí)現(xiàn):該模式的實(shí)現(xiàn)主要就是要表示整體或部分的所有類(lèi)都繼承自同一的基類(lèi)或接口,從而擁有使用接口上一定的一致性。重構(gòu)成本:高。2.4Decorator思想:為一個(gè)對(duì)象已有的子類(lèi)添加一些額外的職責(zé)。場(chǎng)景:該模式的使用場(chǎng)景,主要是有的時(shí)候我們不愿意定義邏輯上新的子類(lèi),因?yàn)闆](méi)有新的邏輯含義上的子類(lèi)概念,而只是想為一個(gè)已存在的子類(lèi)附加 一些職責(zé)。實(shí)現(xiàn):該 模式的實(shí)現(xiàn)主要就是定義一個(gè)物理上的新的子類(lèi),但是,它只是包含要附加職責(zé)的類(lèi),傳遞外部對(duì)相同

14、接口的調(diào)用,在這個(gè)傳遞調(diào)用的通道上附加額外的功能。突然 想到,Decorator模式是不是一定程度上也能代替DynamicProxy模 式,從而成為一種AOP實(shí)現(xiàn)的方案呢?重構(gòu)成本:低。定義一個(gè)Decorator和一個(gè)已有類(lèi)的邏輯上的子類(lèi),物理 表現(xiàn)形式上都是一個(gè)子類(lèi),重構(gòu)也確實(shí)不是難事。2.5 Facade思想:為子系統(tǒng)中的一組接口提供一個(gè)一致的界面,這個(gè)接口使得這一子系統(tǒng)更加容易使用。場(chǎng)景:當(dāng) 你要為一個(gè)復(fù)雜子系統(tǒng)提供一個(gè)簡(jiǎn)單接口時(shí)。子系統(tǒng)往往因?yàn)椴粩嘌莼兊迷絹?lái)越復(fù)雜。大多數(shù)模式使用時(shí)都會(huì)產(chǎn)生更多更小的類(lèi)。這使得子系統(tǒng)更具可重用性, 也更容易對(duì)子系統(tǒng)進(jìn)行定制,但這也給那些不需要定制子系

15、統(tǒng)的用戶帶來(lái)一些使用上的困難。Facade可 以提供一個(gè)簡(jiǎn)單的缺省視圖,這一視圖對(duì)大多數(shù)用戶來(lái)說(shuō)已經(jīng)足夠,而那些需要更多的可定制性的用戶可以越過(guò)Facade層。 客戶程序與抽象類(lèi)的實(shí)現(xiàn)部分之間存在著很大的依賴性。引入Facade將這個(gè)子系統(tǒng)與客戶以及其他 的子系統(tǒng)分離,可以提高子系統(tǒng)的獨(dú)立性和可移植性。當(dāng)你需要構(gòu)建一個(gè)層次結(jié)構(gòu)的子系統(tǒng)時(shí),使用Facade模 式定義子系統(tǒng)中每層的入口點(diǎn)。如果子系統(tǒng)之間是相互依賴的,你可以讓它們僅通過(guò)Facade進(jìn)行通 訊,從而簡(jiǎn)化了它們之間的依賴關(guān)系。(這里直接引用了設(shè)計(jì)模式迷你手冊(cè),因?yàn)橛X(jué)得它確實(shí)已經(jīng)說(shuō)得很明了了,下面類(lèi)似的情形我直接引用原文的就不再注明 了,

16、這里先說(shuō)明一下,感謝手冊(cè)作者的這些優(yōu)秀總結(jié)。當(dāng)然,本文的絕大多數(shù)文字都是Teddy本 人的原創(chuàng)看法,絕非抄襲,您可以比較本文和附件手冊(cè),附件同時(shí)也會(huì)提供本文的Word版本下 載。)實(shí)現(xiàn):該 模式的實(shí)現(xiàn)需要定義一個(gè)新的系統(tǒng)構(gòu)架上的Layer,該層向上提供一組新的接口,向下調(diào)用子系統(tǒng)原 有的接口。重構(gòu)成本:高。要修改所有直接對(duì)子系統(tǒng)的地調(diào)用為對(duì)Façade層的調(diào)用還是 有很多事情要做的。不過(guò),現(xiàn)代IDE中,如果我們刪除調(diào)用層對(duì)子系統(tǒng)的程序集引用,那么所有這些我 們需要修改的調(diào)用都能標(biāo)示出來(lái),因?yàn)榫幾g不能通過(guò)了嘛,因此,重構(gòu)的風(fēng)險(xiǎn)還不算特別大,只是工作量著實(shí)不小。2.6Flyweight思

17、想:說(shuō)Flyweight可 能有的朋友第一次看到想象不到是什么樣子,其實(shí)說(shuō)他就是一個(gè)Pool,你可能就明白了。也就是由一 個(gè)Flyweight Factory來(lái)管理一族一定數(shù)目邏輯上經(jīng)常需要構(gòu)建和銷(xiāo)毀的細(xì)顆粒對(duì)象, 例如我們常見(jiàn)的數(shù)據(jù)庫(kù)連接池。在Factory內(nèi)部,并不物理銷(xiāo)毀這些對(duì)象,而在接到實(shí)例化請(qǐng)求時(shí) 返回這些被關(guān)系對(duì)象的實(shí)例,從而減少創(chuàng)建銷(xiāo)毀這些細(xì)顆粒對(duì)象的開(kāi)銷(xiāo)。場(chǎng)景:基 本上所有的需要Pool這個(gè)概念的環(huán)境都能應(yīng)用。實(shí)現(xiàn):實(shí)現(xiàn)的底層方式可以千變?nèi)f化,在接口上就是如上圖所示,花樣不多。這里就不多解釋。重構(gòu)成本:低。2.7 Proxy思想:前 面在Decorator模式中也提到了Prox

18、y模 式了。它是通過(guò)邏輯上繼承一個(gè)已有類(lèi)的子類(lèi),從而擴(kuò)展原有的子類(lèi)的功能。場(chǎng)景:需 要注意體會(huì)他和Decorator的需別。Proxy是 繼承需要修飾的類(lèi),而Decorator用的是包含的方式。Proxy模 式,或者準(zhǔn)確地說(shuō)DynamicProxy模式,是現(xiàn)代AOP框 架實(shí)現(xiàn)中的一種常用方式。典型的實(shí)現(xiàn)如Spring,JBoss以 及Castle Project中的Aspect#。實(shí)現(xiàn):繼承,并在過(guò)載方法中添加需要的修飾功能。重構(gòu)成本:低。3 行為型3.1 Interpreter思想:當(dāng) 有一個(gè)語(yǔ)言需要解釋執(zhí)行, 并且你可將該語(yǔ)言中的句子表示為一個(gè)抽象語(yǔ)法樹(shù)時(shí),定義一個(gè)解釋器,這 個(gè)解釋器使用

19、該表示來(lái)解釋語(yǔ)言中的句子。場(chǎng)景:其 實(shí),從物理結(jié)構(gòu)上,該模式的代碼架構(gòu)看起來(lái)可能和Composite模式一模一樣,致使其針對(duì)的邏 輯語(yǔ)義不同。Composite模式描述一種一般的整體和部分使用接口上的一致性,而Interpreter模 式則側(cè)重于語(yǔ)言解釋器的實(shí)現(xiàn)構(gòu)架。實(shí)現(xiàn):如 上圖,基本同Composite模式。重構(gòu)成本:高。3.2Iterator思想:提 供一種方法順序訪問(wèn)一個(gè)聚合對(duì)象中各個(gè)元素, 而又不需暴露該對(duì)象的內(nèi)部表示。場(chǎng)景:訪 問(wèn)一個(gè)聚合對(duì)象的內(nèi)容而無(wú)需暴露它的內(nèi)部表示。支持對(duì)聚合對(duì)象的多種遍歷。為遍歷不同的聚合結(jié)構(gòu)提供一個(gè)統(tǒng)一的接口(即, 支持多態(tài)迭代)。實(shí)現(xiàn):其 實(shí)就是定義一個(gè)

20、邏輯上類(lèi)似一個(gè)指針的迭代類(lèi)。專門(mén)用于這種迭代工作。如果對(duì)C+ STL火鍋功夫 學(xué)習(xí)的朋友一定不會(huì)陌生啦。實(shí)際使用過(guò)一下就明白了。除了功能之外,他給我最大的感受就是他讓我熟悉的for(int i = 0; i < list.Count; i+)語(yǔ)句,變長(zhǎng)了好多。-重構(gòu)成本:中。3.3Mediator思想:用一個(gè)中介對(duì)象來(lái)封裝一系列的對(duì)象交互。中介者使各對(duì)象不需要顯式地相互引用,從而使其耦合松散,而且可以獨(dú)立地改變它們之間的交互。場(chǎng)景:該模式主要用來(lái)進(jìn)行降低一組相互關(guān)聯(lián)調(diào)用的對(duì)象間的耦合度。如果您發(fā)現(xiàn)您的系統(tǒng)的某部分的一組對(duì)象間調(diào)用極其頻繁的壞味道的話,可能您 需要考慮使用該模式來(lái)進(jìn)行一些解

21、耦,否則,這些對(duì)象中的任何一個(gè)的修改,都將可能導(dǎo)致其他對(duì)象許多地方的修改,可維護(hù)性就降低了。實(shí)現(xiàn):定義一個(gè)專門(mén)的中介對(duì)象來(lái)封裝和傳遞一組對(duì)象間的調(diào)用。重構(gòu)成本:中。3.4Memento思想:用在不破壞封裝性的前提下,捕獲一個(gè)對(duì)象的內(nèi)部狀態(tài),并在該對(duì)象之外保存這個(gè)狀態(tài)。這樣以后就可將該對(duì)象恢復(fù)到原先保存的狀態(tài)。場(chǎng)景:該 模式主要用來(lái)實(shí)現(xiàn)類(lèi)似我們?cè)诔R?jiàn)的編輯器中經(jīng)常執(zhí)行的Undo(Ctrl+Z) 操作。實(shí)際上就是在外部保持一組對(duì)象的某一時(shí)刻的狀態(tài),并在需要的另一個(gè)時(shí)候?qū)⑦@組對(duì)象回復(fù)到之前的狀態(tài)。實(shí)現(xiàn):該 模式其實(shí)主要是一種對(duì)象狀態(tài)的暫存和回復(fù)的思想。上面的UML圖是一種比較典型的實(shí)現(xiàn)方式定一 個(gè)專

22、門(mén)用于保存類(lèi)狀態(tài)的類(lèi),為被保存狀態(tài)的類(lèi)定義返回當(dāng)前狀態(tài)類(lèi)實(shí)例,和根據(jù)狀態(tài)類(lèi)實(shí)例回復(fù)對(duì)象狀態(tài)的接口。實(shí)際上也不必太拘泥于這個(gè)實(shí)現(xiàn),簡(jiǎn)單情形下, 我們完全可以利用任何的已有的對(duì)象持久化或者序列化機(jī)制來(lái)用一個(gè)字符串暫存對(duì)象的當(dāng)前完整狀態(tài)。重構(gòu)成本:低。3.5 Template Method思想:定 義一個(gè)操作中的算法的骨架,而將一些步驟延遲到子類(lèi)中。Te m p l a t e M e t h o d 使 得子類(lèi)可以不改變一個(gè)算法的結(jié)構(gòu)即可重定義該算法的某些特定步驟。場(chǎng)景:該 模式實(shí)際上是一種非常直觀和可理解的OO思想下的代碼重用的實(shí)現(xiàn)。只需一次性實(shí)現(xiàn)一個(gè)算法的不變的 部分,并將可變的行為留給子類(lèi)來(lái)

23、實(shí)現(xiàn)。各子類(lèi)中公共的行為應(yīng)被提取出來(lái)并集中到一個(gè)公共父類(lèi)中以避免代碼重復(fù)。模板方法只允許在特定點(diǎn)計(jì)算法的某個(gè)階段被 過(guò)載,這樣也就只允許在這些點(diǎn)進(jìn)行擴(kuò)展。實(shí)現(xiàn):見(jiàn)上圖,太簡(jiǎn)單了,就不多說(shuō)了。重構(gòu)成本:低。3.6 Chain of Responsibility思想:使多個(gè)對(duì)象都有機(jī)會(huì)處理請(qǐng)求,從而避免請(qǐng)求的發(fā)送者和接收者之間的耦合關(guān)系。將這些對(duì)象連成一條鏈,并沿著這條鏈傳遞該請(qǐng)求,直到有一 個(gè)對(duì)象處理它為止。場(chǎng)景:該模式實(shí)際上是對(duì)人們常會(huì)不自覺(jué)地去做的一種代碼組織方式的總結(jié)而已。有的時(shí)候一條消息需要被處理,我們當(dāng)然可以在一個(gè)雷的一個(gè)方法中 對(duì)他進(jìn)行所有需要的處理。但是,如果要做的處理很復(fù)雜的情形

24、,甚至能夠按照一定的邏輯醒來(lái)分類(lèi)所有這些處理,則不要在一個(gè)雷一個(gè)函數(shù)里處以一切會(huì)更好,我 們可以定義多個(gè)處理類(lèi)類(lèi)表示邏輯上的不同的處理,然后一個(gè)個(gè)處理類(lèi)的傳遞這個(gè)消息對(duì)象,讓希望處理該消息的類(lèi)自己決定是不是要處理。這樣,就能將一個(gè)難以 維護(hù)的復(fù)雜處理過(guò)程,分解為一系列簡(jiǎn)單明了,易于維護(hù)的類(lèi)了。實(shí)現(xiàn):上圖是實(shí)現(xiàn)方式之一。即,使所有可能處理該請(qǐng)求的對(duì)象繼承自一個(gè)基類(lèi),實(shí)際上,只要邏輯語(yǔ)義上我們保持這樣一種讓每個(gè)處理類(lèi)自己決定何 時(shí)處理,并傳遞請(qǐng)求的思想,實(shí)現(xiàn)方式也可以千變?nèi)f化,無(wú)論是用接口代替,或者甚至只是簡(jiǎn)單的定義相同結(jié)構(gòu)的處理函數(shù)而通過(guò)反射機(jī)制來(lái)調(diào)用處理函數(shù)和傳遞處 理請(qǐng)求,都是可選的方案。重

25、構(gòu)成本:中。3.7Command思想:將一個(gè)動(dòng)態(tài)的執(zhí)行過(guò)程封裝成一個(gè)對(duì)象,可以像處理數(shù)據(jù)來(lái)處理和管理這樣的對(duì)象,在需要的時(shí)候激發(fā)該對(duì)象的方法就能執(zhí)行被封裝的執(zhí)行過(guò) 程。場(chǎng)景:該模式在很多時(shí)候非常有用,它使得我們對(duì)邏輯上已經(jīng)激發(fā)的行為進(jìn)行優(yōu)化成為可能,我們不僅可以根據(jù)需要改變一組邏輯上以經(jīng)濟(jì)法的活動(dòng)的 順序,消冗余操作,撤銷(xiāo)不必要的操作等。也可以把活動(dòng)和操作視為資源一樣來(lái)管理和重用。同時(shí)該模式也是許多事務(wù)處理機(jī)制的基礎(chǔ)。實(shí)現(xiàn):實(shí)現(xiàn)很簡(jiǎn)單,只是定義一些能夠通過(guò)指定接口被激發(fā)的對(duì)活動(dòng)進(jìn)行封裝的類(lèi),然后我們按照需要管理這些類(lèi),并在需要的時(shí)候激發(fā)這些活動(dòng)。您 還是應(yīng)該更多地去體會(huì),為什么他是事務(wù)處理機(jī)制

26、的基礎(chǔ),當(dāng)我們可以這樣來(lái)管理一組活動(dòng)的時(shí)候,可以對(duì)這些活動(dòng)進(jìn)行那些有趣的控制。重構(gòu)成本:高。3.8Observer思想:定 義對(duì)象間的一種一對(duì)多的依賴關(guān)系,當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生改變時(shí), 所 有依賴于它的對(duì)象都得到通知并被自動(dòng)更新。場(chǎng)景:上面描述該模式思想的文字可能顯得有些拗口,實(shí)際上你也不用想得過(guò)于復(fù)雜。只要你寫(xiě)過(guò)任何的基于圖形界面的程序,那么實(shí)際上您對(duì)他是一 點(diǎn)也不該陌生的。它就是我們每一次鼠標(biāo)鍵盤(pán)敲擊都在我們的程序內(nèi)部流轉(zhuǎn)著的事件機(jī)制的基礎(chǔ)。當(dāng)一個(gè)事件發(fā)生,則通知訂閱該事件的對(duì)象。實(shí)現(xiàn):上 面的UML圖看似復(fù)雜,實(shí)際上,去理解它的最好的辦法就是試著思考和使用任何一種OO語(yǔ) 言來(lái)定義一個(gè)擁有事件機(jī)制的類(lèi)。比如,.Net下,你只要好好去看看關(guān)于delegate的 文檔,嘗試著根據(jù)MSDN寫(xiě)寫(xiě)看一個(gè)最簡(jiǎn)單的自定義事件。那么,上面的UML圖, 我敢保證你能很輕易的看明白。重構(gòu)成本:高。3.9 State思想:允許一個(gè)對(duì)象在其內(nèi)部狀態(tài)改變時(shí)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論