第十章 設(shè)計(jì)模式
10.1 設(shè)計(jì)模式概述
對(duì)被用來(lái)在特定場(chǎng)景下解決一般設(shè)計(jì)問題的類和互相通信的對(duì)象的描述缭付,通俗的說(shuō)拓诸,可以把設(shè)計(jì)模式理解為對(duì)某一類問題的通用解決方案兆览。
10.1.1 設(shè)計(jì)模式的概念
設(shè)計(jì)模式解決的是一類問題苔埋。是一種通用的解決方案嘲叔,而不是具體的亡呵,也不是唯一的。學(xué)習(xí)設(shè)計(jì)模式時(shí)需要注意一下兩點(diǎn):
- 學(xué)習(xí)這些模式是一個(gè)方面硫戈,另一方面更要了解模式中的思想锰什。設(shè)計(jì)模式本身是為了提高軟件架構(gòu)的質(zhì)量,學(xué)習(xí)設(shè)計(jì)模式的目的也是為了提高架構(gòu)設(shè)計(jì)的水平卿啡。
- 設(shè)計(jì)模式雖然可以使設(shè)計(jì)變得更精妙绵疲,但濫用設(shè)計(jì)模式會(huì)適得其反贮乳。
10.1.2 設(shè)計(jì)模式的組成
在描述一個(gè)設(shè)計(jì)模式,至少要包含四個(gè)方面:模式名稱嫩码、問題、解決方案罪既、效果铸题。
10.1.3 GoF設(shè)計(jì)模式
23個(gè)設(shè)計(jì)模式統(tǒng)稱為GoF模式铡恕,這23個(gè)模式如下:
- Factory Method模式:提供了一種延遲創(chuàng)建創(chuàng)建類的方法,使用這個(gè)方法可以在運(yùn)行期間由子類決定創(chuàng)建哪一個(gè)類的實(shí)例丢间。
- Abstract Factory模式探熔。又稱抽象工廠模式,主要為解決復(fù)雜系統(tǒng)中對(duì)象創(chuàng)建的問題烘挫。抽象工廠模式提供了一個(gè)一致的對(duì)象創(chuàng)建接口來(lái)創(chuàng)建一系列具有相似基類或相似接口的對(duì)象诀艰。
- Builder模式。與抽象工廠模式非常類似饮六,但是Builder模式是逐步的構(gòu)造出一個(gè)復(fù)雜對(duì)象其垄,并在最后返回對(duì)象的實(shí)例÷遍希可以把復(fù)雜對(duì)象的創(chuàng)建于表示分離捉捅,使得同樣的創(chuàng)建過程可以創(chuàng)建不同的表示。
- Prototype模式虽风“艨冢可以根據(jù)原型實(shí)例制定創(chuàng)建的對(duì)象的種類,并通過深復(fù)制這個(gè)原型來(lái)創(chuàng)建新的對(duì)象辜膝。有著與抽象工廠模式和建造者模式相同的效果无牵,不過當(dāng)需要實(shí)例化的類是在運(yùn)行期才被指定的而且要避免創(chuàng)建一個(gè)與產(chǎn)品曾是平行的工廠類層次時(shí),可以使用Prototype模式厂抖。該模式可以在運(yùn)行時(shí)增加或減少原型茎毁。
- Singleton模式。保證在一個(gè)類僅有一個(gè)實(shí)例忱辅,從而可以提供一個(gè)單一的全局訪問點(diǎn)七蜘。
- Adapter模式∏蕉可以解決系統(tǒng)間接口不相容的問題橡卤。通過Adapter可以把類的接口轉(zhuǎn)化為客戶程序所希望的接口,從而提高復(fù)用性损搬。
- Bridge模式碧库。把類的抽象部分同實(shí)現(xiàn)部分相分離,這樣類的抽象和實(shí)現(xiàn)都可以獨(dú)立的變化
- Composite模式巧勤。提供了一種以樹形結(jié)構(gòu)組合對(duì)象的方法嵌灰,該模式可以使單個(gè)對(duì)象和組合后的對(duì)象具有一致性以提高軟件的復(fù)用性。
- Decorator模式颅悉」敛t?梢詣?dòng)態(tài)的為對(duì)象的某一個(gè)方法增加更多的功能,很多時(shí)候剩瓶,使用該模式可以不必繼承出新的子類從而維護(hù)間接的類繼承結(jié)構(gòu)驹溃。
- Facade模式柒瓣。為一組類提供了一致的訪問接口。使用該模式可以封裝內(nèi)部具有不同接口的類吠架,使其對(duì)外提供統(tǒng)一的訪問方式芙贫。
- Flyweight模式“可以共享大量的細(xì)粒度對(duì)象磺平,從而節(jié)省創(chuàng)建對(duì)象所需要分配的空間,不過在時(shí)間上的開銷會(huì)變大拐辽。
- Proxy模式拣挪。為對(duì)象提供了一種訪問代理,通過對(duì)象代理可以控制客戶程序的訪問俱诸,也可以將開銷較大的訪問化整為零菠劝,提高訪問效率。
- Interpreter模式睁搭。定義了一個(gè)解釋器赶诊,來(lái)解釋遵循給定語(yǔ)言和文法的句子。
- Template Method模式园骆。定義一個(gè)操作模板舔痪,其中的一些步驟會(huì)在子類中出現(xiàn),以適應(yīng)不同的情況锌唾。
- Chain of Responsibility模式锄码。可以把響應(yīng)請(qǐng)求的對(duì)象組織成一條鏈晌涕,并在這條對(duì)象鏈上傳遞請(qǐng)求滋捶,從而保證多個(gè)對(duì)象都有機(jī)會(huì)處理請(qǐng)求而且可以避免請(qǐng)求方和響應(yīng)方的耦合。
- Command模式余黎。將請(qǐng)求封裝為對(duì)象重窟,從而增強(qiáng)請(qǐng)求的能力。
- Iterator模式驯耻。提供了順序訪問一個(gè)對(duì)象集合中的各元素的方法亲族,使用該模式可以避免暴露集合中對(duì)象的耦合關(guān)系。
- Mediator模式可缚。可以減少系統(tǒng)中對(duì)象間的耦合性斋枢。該模式使用中介對(duì)象封裝其他的對(duì)象帘靡,從而使這些被封裝的對(duì)象間的關(guān)系就成了松散耦合
- Memento模式。提供了一種捕捉對(duì)象狀態(tài)的方法瓤帚,且不會(huì)破壞對(duì)象的封裝描姚。并且可以在對(duì)象外部保存對(duì)象的狀態(tài)涩赢,并在需要的時(shí)候恢復(fù)對(duì)象狀態(tài)。
- Observer模式轩勘。提供了將對(duì)象的狀態(tài)廣播到一組觀察者的方式筒扒,從而可以讓每個(gè)觀察者隨時(shí)可以得到對(duì)象更新的消息。
- State模式绊寻。允許一個(gè)對(duì)象在其內(nèi)部狀態(tài)改變的時(shí)候改變它的行為花墩。
- Strategy模式〕尾剑可以讓對(duì)象中算法的變化獨(dú)立于客戶冰蘑。
- Visitor模式。表示對(duì)某對(duì)象結(jié)構(gòu)中各元素的操作村缸,使用該模式可以在不改變各元素類的前提下定義作用于這些元素的新操作祠肥。
10.1.4 其他設(shè)計(jì)模式
- Intercepting Filter模式。通過截取客戶請(qǐng)求梯皿,并將請(qǐng)求發(fā)送到Filter中仇箱,一步一步的進(jìn)行預(yù)處理,知道這些處理結(jié)束东羹,請(qǐng)求才會(huì)被轉(zhuǎn)發(fā)到真正響應(yīng)客戶請(qǐng)求的Servlet中
- Session Facade模式工碾。
10.1.5 設(shè)計(jì)模式與軟件架構(gòu)
軟件架構(gòu)描述了軟件的組成。設(shè)計(jì)模式則更側(cè)重于類與類百姓、對(duì)象與對(duì)象之間的關(guān)系渊额。
常見的架構(gòu)風(fēng)格有分層架構(gòu)、客戶端——服務(wù)器架構(gòu)垒拢、消息總線旬迹、面向服務(wù)的架構(gòu)。
10.1.6 設(shè)計(jì)模式的分類
GoF模式
-|創(chuàng)建型|結(jié)構(gòu)型|行為型
--|---|
應(yīng)用于類|Factory Method|Adapter|Interpreter<br />Templete Method
應(yīng)用于對(duì)象|Abstract Factory<br />Builder<br />Prototype<br />Singleton|Adapter<br />Bridge<br />Composite<br />Decorator<br />Facade<br />Flyweight<br />Proxy|Chain of Responsibility<br />Command<br />Iterator<br />Mediator<br />Memento<br />Observer<br />State<br />Strategy<br />Visitor
J2EE設(shè)計(jì)模式分類
表現(xiàn)層|業(yè)務(wù)層|綜合層
-----|---
Intercepting Filter<br />Front Controller<br />View Helper<br />Composite View<br />Service to Worker<br />Dispacher View|Business Delegate<br />Value Object<br />Session Facade<br />Composite Entity<br />Value Object Assembler<br />Value List Handler<br />Service Locator|Data Access Object<br />Service Activator
10.2 設(shè)計(jì)模式及實(shí)現(xiàn)
10.2.1 Abstract Factory模式--抽象工廠模式
10.2.2 Singleton模式--單例模式
10.2.3 Decorator模式--裝飾模式
10.2.4 Facade/Session Facade模式--外觀模式求类、門面模式
10.2.5 Mediator模式--中介者模式
10.2.6 Observer模式--觀察者模式
10.2.7 Intercepting Filter模式--篩選器模式
1. 意圖解決的問題
在使用MVC架構(gòu)進(jìn)行Web應(yīng)用開發(fā)時(shí)奔垦,通常需要對(duì)來(lái)自于客戶的請(qǐng)求進(jìn)行一些預(yù)處理,如驗(yàn)證客戶身份尸疆、驗(yàn)證請(qǐng)求來(lái)源椿猎、對(duì)請(qǐng)求解碼等,然后再傳遞給控制器寿弱。如果把這些預(yù)處理都交給控制器來(lái)完成犯眠,將增加控制器的復(fù)雜度,而且難以維護(hù)和擴(kuò)展症革。
2. 模式描述
FilterManager負(fù)責(zé)調(diào)度整個(gè)FilterChain筐咧,它將在請(qǐng)求到達(dá)Target前攔截請(qǐng)求,并傳遞給FilterChain,由FilterChain中的過濾器依次進(jìn)行預(yù)處理量蕊。知道請(qǐng)求經(jīng)過最后一個(gè)過濾器后才完成了全部的預(yù)處理铺罢,然后由FilterManager把請(qǐng)求轉(zhuǎn)發(fā)給實(shí)際的目標(biāo)。
3.效果
使用該模式使得預(yù)處理的邏輯和真正的處理邏輯分離残炮,進(jìn)行實(shí)際處理的Target只需要關(guān)心具體的邏輯韭赘,而同請(qǐng)求相關(guān)的預(yù)處理都放在FilterManager中進(jìn)行。同時(shí)解除了這兩類處理的耦合性势就,擴(kuò)展泉瞻、修改預(yù)處理過程變得容易,系統(tǒng)具有更好的維護(hù)性和擴(kuò)展性
10.3 設(shè)計(jì)模式總結(jié)
學(xué)習(xí)設(shè)計(jì)模式最重要的是理解蛋勺,而不是生搬硬套瓦灶。每種設(shè)計(jì)模式中都包含著良好的設(shè)計(jì)架構(gòu)的思想,如隱藏內(nèi)部細(xì)節(jié)抱完,降低耦合度等贼陶,越是復(fù)雜的系統(tǒng)越是需要這些思想的支撐。