系統(tǒng)架構(gòu)設(shè)計(jì)師學(xué)習(xí)筆記 第十章 設(shè)計(jì)模式

第十章 設(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):

  1. 學(xué)習(xí)這些模式是一個(gè)方面硫戈,另一方面更要了解模式中的思想锰什。設(shè)計(jì)模式本身是為了提高軟件架構(gòu)的質(zhì)量,學(xué)習(xí)設(shè)計(jì)模式的目的也是為了提高架構(gòu)設(shè)計(jì)的水平卿啡。
  2. 設(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è)模式如下:

  1. Factory Method模式:提供了一種延遲創(chuàng)建創(chuàng)建類的方法,使用這個(gè)方法可以在運(yùn)行期間由子類決定創(chuàng)建哪一個(gè)類的實(shí)例丢间。
  2. Abstract Factory模式探熔。又稱抽象工廠模式,主要為解決復(fù)雜系統(tǒng)中對(duì)象創(chuàng)建的問題烘挫。抽象工廠模式提供了一個(gè)一致的對(duì)象創(chuàng)建接口來(lái)創(chuàng)建一系列具有相似基類或相似接口的對(duì)象诀艰。
  3. Builder模式。與抽象工廠模式非常類似饮六,但是Builder模式是逐步的構(gòu)造出一個(gè)復(fù)雜對(duì)象其垄,并在最后返回對(duì)象的實(shí)例÷遍希可以把復(fù)雜對(duì)象的創(chuàng)建于表示分離捉捅,使得同樣的創(chuàng)建過程可以創(chuàng)建不同的表示。
  4. 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í)增加或減少原型茎毁。
  5. Singleton模式。保證在一個(gè)類僅有一個(gè)實(shí)例忱辅,從而可以提供一個(gè)單一的全局訪問點(diǎn)七蜘。
  6. Adapter模式∏蕉可以解決系統(tǒng)間接口不相容的問題橡卤。通過Adapter可以把類的接口轉(zhuǎn)化為客戶程序所希望的接口,從而提高復(fù)用性损搬。
  7. Bridge模式碧库。把類的抽象部分同實(shí)現(xiàn)部分相分離,這樣類的抽象和實(shí)現(xiàn)都可以獨(dú)立的變化
  8. Composite模式巧勤。提供了一種以樹形結(jié)構(gòu)組合對(duì)象的方法嵌灰,該模式可以使單個(gè)對(duì)象和組合后的對(duì)象具有一致性以提高軟件的復(fù)用性。
  9. Decorator模式颅悉」敛t?梢詣?dòng)態(tài)的為對(duì)象的某一個(gè)方法增加更多的功能,很多時(shí)候剩瓶,使用該模式可以不必繼承出新的子類從而維護(hù)間接的類繼承結(jié)構(gòu)驹溃。
  10. Facade模式柒瓣。為一組類提供了一致的訪問接口。使用該模式可以封裝內(nèi)部具有不同接口的類吠架,使其對(duì)外提供統(tǒng)一的訪問方式芙贫。
  11. Flyweight模式“可以共享大量的細(xì)粒度對(duì)象磺平,從而節(jié)省創(chuàng)建對(duì)象所需要分配的空間,不過在時(shí)間上的開銷會(huì)變大拐辽。
  12. Proxy模式拣挪。為對(duì)象提供了一種訪問代理,通過對(duì)象代理可以控制客戶程序的訪問俱诸,也可以將開銷較大的訪問化整為零菠劝,提高訪問效率。
  13. Interpreter模式睁搭。定義了一個(gè)解釋器赶诊,來(lái)解釋遵循給定語(yǔ)言和文法的句子。
  14. Template Method模式园骆。定義一個(gè)操作模板舔痪,其中的一些步驟會(huì)在子類中出現(xiàn),以適應(yīng)不同的情況锌唾。
  15. Chain of Responsibility模式锄码。可以把響應(yīng)請(qǐng)求的對(duì)象組織成一條鏈晌涕,并在這條對(duì)象鏈上傳遞請(qǐng)求滋捶,從而保證多個(gè)對(duì)象都有機(jī)會(huì)處理請(qǐng)求而且可以避免請(qǐng)求方和響應(yīng)方的耦合。
  16. Command模式余黎。將請(qǐng)求封裝為對(duì)象重窟,從而增強(qiáng)請(qǐng)求的能力。
  17. Iterator模式驯耻。提供了順序訪問一個(gè)對(duì)象集合中的各元素的方法亲族,使用該模式可以避免暴露集合中對(duì)象的耦合關(guān)系。
  18. Mediator模式可缚。可以減少系統(tǒng)中對(duì)象間的耦合性斋枢。該模式使用中介對(duì)象封裝其他的對(duì)象帘靡,從而使這些被封裝的對(duì)象間的關(guān)系就成了松散耦合
  19. Memento模式。提供了一種捕捉對(duì)象狀態(tài)的方法瓤帚,且不會(huì)破壞對(duì)象的封裝描姚。并且可以在對(duì)象外部保存對(duì)象的狀態(tài)涩赢,并在需要的時(shí)候恢復(fù)對(duì)象狀態(tài)。
  20. Observer模式轩勘。提供了將對(duì)象的狀態(tài)廣播到一組觀察者的方式筒扒,從而可以讓每個(gè)觀察者隨時(shí)可以得到對(duì)象更新的消息。
  21. State模式绊寻。允許一個(gè)對(duì)象在其內(nèi)部狀態(tài)改變的時(shí)候改變它的行為花墩。
  22. Strategy模式〕尾剑可以讓對(duì)象中算法的變化獨(dú)立于客戶冰蘑。
  23. Visitor模式。表示對(duì)某對(duì)象結(jié)構(gòu)中各元素的操作村缸,使用該模式可以在不改變各元素類的前提下定義作用于這些元素的新操作祠肥。

10.1.4 其他設(shè)計(jì)模式

  1. Intercepting Filter模式。通過截取客戶請(qǐng)求梯皿,并將請(qǐng)求發(fā)送到Filter中仇箱,一步一步的進(jìn)行預(yù)處理,知道這些處理結(jié)束东羹,請(qǐng)求才會(huì)被轉(zhuǎn)發(fā)到真正響應(yīng)客戶請(qǐng)求的Servlet中
  2. 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模式--抽象工廠模式

Java設(shè)計(jì)模式-工廠模式

10.2.2 Singleton模式--單例模式

Java設(shè)計(jì)模式-單例模式

10.2.3 Decorator模式--裝飾模式

Java設(shè)計(jì)模式-裝飾模式

10.2.4 Facade/Session Facade模式--外觀模式求类、門面模式

Java設(shè)計(jì)模式-裝飾模式

10.2.5 Mediator模式--中介者模式

Java設(shè)計(jì)模式-裝飾模式

10.2.6 Observer模式--觀察者模式

Java設(shè)計(jì)模式-觀察者模式

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)越是需要這些思想的支撐。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末巧娱,一起剝皮案震驚了整個(gè)濱河市碉怔,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌禁添,老刑警劉巖撮胧,帶你破解...
    沈念sama閱讀 218,607評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異老翘,居然都是意外死亡芹啥,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門铺峭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)墓怀,“玉大人,你說(shuō)我怎么就攤上這事卫键】模” “怎么了?”我有些...
    開封第一講書人閱讀 164,960評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵莉炉,是天一觀的道長(zhǎng)钓账。 經(jīng)常有香客問我,道長(zhǎng)絮宁,這世上最難降的妖魔是什么梆暮? 我笑而不...
    開封第一講書人閱讀 58,750評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮羞福,結(jié)果婚禮上惕蹄,老公的妹妹穿的比我還像新娘。我一直安慰自己治专,他們只是感情好卖陵,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,764評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著张峰,像睡著了一般泪蔫。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上喘批,一...
    開封第一講書人閱讀 51,604評(píng)論 1 305
  • 那天撩荣,我揣著相機(jī)與錄音,去河邊找鬼饶深。 笑死餐曹,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的敌厘。 我是一名探鬼主播台猴,決...
    沈念sama閱讀 40,347評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼俱两!你這毒婦竟也來(lái)了饱狂?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,253評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤宪彩,失蹤者是張志新(化名)和其女友劉穎休讳,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體尿孔,經(jīng)...
    沈念sama閱讀 45,702評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡俊柔,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,893評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了活合。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片雏婶。...
    茶點(diǎn)故事閱讀 40,015評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖芜辕,靈堂內(nèi)的尸體忽然破棺而出尚骄,到底是詐尸還是另有隱情,我是刑警寧澤侵续,帶...
    沈念sama閱讀 35,734評(píng)論 5 346
  • 正文 年R本政府宣布倔丈,位于F島的核電站,受9級(jí)特大地震影響状蜗,放射性物質(zhì)發(fā)生泄漏需五。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,352評(píng)論 3 330
  • 文/蒙蒙 一轧坎、第九天 我趴在偏房一處隱蔽的房頂上張望宏邮。 院中可真熱鬧,春花似錦、人聲如沸蜜氨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)飒炎。三九已至埋哟,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間郎汪,已是汗流浹背赤赊。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留煞赢,地道東北人抛计。 一個(gè)月前我還...
    沈念sama閱讀 48,216評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像照筑,于是被迫代替她去往敵國(guó)和親吹截。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,969評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 第九章 軟件架構(gòu)設(shè)計(jì) 9.1 軟件架構(gòu)概述 9.1.1 軟件架構(gòu)的定義 定義1:軟件或計(jì)算機(jī)系統(tǒng)的軟件架構(gòu)是該系統(tǒng)...
    步積閱讀 4,787評(píng)論 0 17
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理朦肘,服務(wù)發(fā)現(xiàn)饭弓,斷路器,智...
    卡卡羅2017閱讀 134,657評(píng)論 18 139
  • 每一次久別后的重逢媒抠, 你的眼神總充滿憂郁弟断, 有許多的話無(wú)從說(shuō)起, 既然今生再不能一起趴生, 那一切美妙的過往阀趴, 就讓它...
    劉小地閱讀 505評(píng)論 43 89
  • 互聯(lián)網(wǎng)的蓬勃發(fā)展浸踩,讓無(wú)數(shù)的程序員身價(jià)水漲船高叔汁,都變成了「香餑餑」,更有了不少「創(chuàng)業(yè)」检碗,「當(dāng)上 CTO据块,迎娶白富美的...
    OneAPM閱讀 820評(píng)論 1 9
  • 所謂遇見 那是無(wú)意中的巧合 。 2012年 我和他在網(wǎng)上認(rèn)識(shí) 開始和他聊覺得沒什么 漸漸的他會(huì)給我聊些他家里...
    有個(gè)孩子莫名其妙閱讀 142評(píng)論 0 1