設(shè)計(jì)模式簡(jiǎn)介

設(shè)計(jì)模式概述

設(shè)計(jì)模式(Design pattern)代表了最佳的實(shí)踐,通常被有經(jīng)驗(yàn)的面向?qū)ο蟮能浖_(kāi)發(fā)人員所采用。設(shè)計(jì)模式是軟件開(kāi)發(fā)人員在軟件開(kāi)發(fā)過(guò)程中面臨的一般問(wèn)題的解決方案。這些解決方案是眾多軟件開(kāi)發(fā)人員經(jīng)過(guò)相當(dāng)長(zhǎng)的一段時(shí)間的試驗(yàn)和錯(cuò)誤總結(jié)出來(lái)的翼闹。

設(shè)計(jì)模式是一套被反復(fù)使用的、多數(shù)人知曉的、經(jīng)過(guò)分類編目的烁竭、代碼設(shè)計(jì)經(jīng)驗(yàn)的總結(jié)。使用設(shè)計(jì)模式是為了重用代碼吉挣、讓代碼更容易被他人理解派撕、保證代碼可靠性。 毫無(wú)疑問(wèn)睬魂,設(shè)計(jì)模式于己于他人于系統(tǒng)都是多贏的终吼,設(shè)計(jì)模式使代碼編制真正工程化,設(shè)計(jì)模式是軟件工程的基石氯哮,如同大廈的一塊塊磚石一樣际跪。項(xiàng)目中合理地運(yùn)用設(shè)計(jì)模式可以完美地解決很多問(wèn)題,每種模式在現(xiàn)實(shí)中都有相應(yīng)的原理來(lái)與之對(duì)應(yīng)喉钢,每種模式都描述了一個(gè)在我們周?chē)粩嘀貜?fù)發(fā)生的問(wèn)題姆打,以及該問(wèn)題的核心解決方案,這也是設(shè)計(jì)模式能被廣泛應(yīng)用的原因肠虽。

什么是 GOF(四人幫幔戏,全拼 Gang of Four)

在 1994 年,由 Erich Gamma舔痕、Richard Helm评抚、Ralph Johnson 和 John Vlissides 四人合著出版了一本名為 Design Patterns - Elements of Reusable Object-Oriented Software(中文譯名:設(shè)計(jì)模式 - 可復(fù)用的面向?qū)ο筌浖兀?的書(shū),該書(shū)首次提到了軟件開(kāi)發(fā)中設(shè)計(jì)模式的概念伯复。
四位作者合稱 GOF(四人幫慨代,全拼 Gang of Four)。他們所提出的設(shè)計(jì)模式主要是基于以下的面向?qū)ο笤O(shè)計(jì)原則:
對(duì)接口編程而不是對(duì)實(shí)現(xiàn)編程啸如;優(yōu)先使用對(duì)象組合而不是繼承侍匙。

設(shè)計(jì)模式的使用

設(shè)計(jì)模式在軟件開(kāi)發(fā)中的兩個(gè)主要用途。

  • 開(kāi)發(fā)人員的共同平臺(tái)

設(shè)計(jì)模式提供了一個(gè)標(biāo)準(zhǔn)的術(shù)語(yǔ)系統(tǒng)叮雳,且具體到特定的情景想暗。例如,單例設(shè)計(jì)模式意味著使用單個(gè)對(duì)象帘不,這樣所有熟悉單例設(shè)計(jì)模式的開(kāi)發(fā)人員都能使用單個(gè)對(duì)象说莫,并且可以通過(guò)這種方式告訴對(duì)方,程序使用的是單例模式寞焙。

  • 最佳的實(shí)踐

設(shè)計(jì)模式已經(jīng)經(jīng)歷了很長(zhǎng)一段時(shí)間的發(fā)展储狭,它們提供了軟件開(kāi)發(fā)過(guò)程中面臨的一般問(wèn)題的最佳解決方案互婿。學(xué)習(xí)這些模式有助于經(jīng)驗(yàn)不足的開(kāi)發(fā)人員通過(guò)一種簡(jiǎn)單快捷的方式來(lái)學(xué)習(xí)軟件設(shè)計(jì)。

設(shè)計(jì)模式的類型

  • 根據(jù)目的來(lái)分

根據(jù)模式是用來(lái)完成什么工作來(lái)劃分辽狈,這種方式可分為創(chuàng)建型模式慈参、結(jié)構(gòu)型模式和行為型模式 3 種。

創(chuàng)建型模式

用于描述“怎樣創(chuàng)建對(duì)象”刮萌,它的主要特點(diǎn)是“將對(duì)象的創(chuàng)建與使用分離”驮配。GoF 中提供了單例、原型着茸、工廠方法壮锻、抽象工廠、建造者等 5 種創(chuàng)建型模式元扔。

結(jié)構(gòu)型模式

用于描述如何將類或?qū)ο蟀茨撤N布局組成更大的結(jié)構(gòu)躯保,GoF 中提供了代理旋膳、適配器澎语、橋接、裝飾验懊、外觀擅羞、享元、組合等 7 種結(jié)構(gòu)型模式义图。

行為型模式

用于描述類或?qū)ο笾g怎樣相互協(xié)作共同完成單個(gè)對(duì)象都無(wú)法單獨(dú)完成的任務(wù)减俏,以及怎樣分配職責(zé)。GoF 中提供了模板方法碱工、策略娃承、命令、職責(zé)鏈怕篷、狀態(tài)历筝、觀察者、中介者廊谓、迭代器梳猪、訪問(wèn)者、備忘錄蒸痹、解釋器等 11 種行為型模式春弥。

  • 根據(jù)作用范圍來(lái)分

根據(jù)模式是主要用于類上還是主要用于對(duì)象上來(lái)分,這種方式可分為類模式和對(duì)象模式兩種叠荠。

類模式

用于處理類與子類之間的關(guān)系匿沛,這些關(guān)系通過(guò)繼承來(lái)建立,是靜態(tài)的榛鼎,在編譯時(shí)刻便確定下來(lái)了逃呼。GoF中的工廠方法公给、(類)適配器、模板方法蜘渣、解釋器屬于該模式淌铐。

對(duì)象模式

用于處理對(duì)象之間的關(guān)系,這些關(guān)系可以通過(guò)組合或聚合來(lái)實(shí)現(xiàn)蔫缸,在運(yùn)行時(shí)刻是可以變化的腿准,更具動(dòng)態(tài)性。GoF 中除了以上 4 種拾碌,其他的都是對(duì)象模式吐葱。
GOF 的 23 種設(shè)計(jì)模式的分類表

范圍\目的 創(chuàng)建型模式 結(jié)構(gòu)型模式 行為型模式
類模式 工廠方法 (類)適配器 模板方法
解釋器
對(duì)象模式 單例
原型
抽象工廠
建造者
代理
(對(duì)象)適配器
橋接
裝飾
外觀
享元
組合
策略
命令
職責(zé)鏈
狀態(tài)
觀察者
中介者
迭代器
訪問(wèn)者
備忘錄

整體描述一下設(shè)計(jì)模式之間的關(guān)系

image.png

GoF的23種設(shè)計(jì)模式的功能

  • 創(chuàng)建型模式

  1. 單例(Singleton)模式:某個(gè)類只能生成一個(gè)實(shí)例,該類提供了一個(gè)全局訪問(wèn)點(diǎn)供外部獲取該實(shí)例校翔,其拓展是有限多例模式弟跑。
  2. 原型(Prototype)模式:將一個(gè)對(duì)象作為原型,通過(guò)對(duì)其進(jìn)行復(fù)制而克隆出多個(gè)和原型類似的新實(shí)例防症。
  3. 工廠方法(Factory Method)模式:定義一個(gè)用于創(chuàng)建產(chǎn)品的接口孟辑,由子類決定生產(chǎn)什么產(chǎn)品。
  4. 抽象工廠(AbstractFactory)模式:提供一個(gè)創(chuàng)建產(chǎn)品族的接口蔫敲,其每個(gè)子類可以生產(chǎn)一系列相關(guān)的產(chǎn)品饲嗽。
  5. 建造者(Builder)模式:將一個(gè)復(fù)雜對(duì)象分解成多個(gè)相對(duì)簡(jiǎn)單的部分,然后根據(jù)不同需要分別創(chuàng)建它們奈嘿,最后構(gòu)建成該復(fù)雜對(duì)象貌虾。
  • 結(jié)構(gòu)型模式

  1. 代理(Proxy)模式:為某對(duì)象提供一種代理以控制對(duì)該對(duì)象的訪問(wèn)。即客戶端通過(guò)代理間接地訪問(wèn)該對(duì)象裙犹,從而限制尽狠、增強(qiáng)或修改該對(duì)象的一些特性。
  2. 適配器(Adapter)模式:將一個(gè)類的接口轉(zhuǎn)換成客戶希望的另外一個(gè)接口叶圃,使得原本由于接口不兼容而不能一起工作的那些類能一起工作袄膏。
  3. 橋接(Bridge)模式:將抽象與實(shí)現(xiàn)分離,使它們可以獨(dú)立變化盗似。它是用組合關(guān)系代替繼承關(guān)系來(lái)實(shí)現(xiàn)哩陕,從而降低了抽象和實(shí)現(xiàn)這兩個(gè)可變維度的耦合度。
  4. 裝飾(Decorator)模式:動(dòng)態(tài)的給對(duì)象增加一些職責(zé)赫舒,即增加其額外的功能悍及。
  5. 外觀(Facade)模式:為多個(gè)復(fù)雜的子系統(tǒng)提供一個(gè)一致的接口,使這些子系統(tǒng)更加容易被訪問(wèn)接癌。
  6. 享元(Flyweight)模式:運(yùn)用共享技術(shù)來(lái)有效地支持大量細(xì)粒度對(duì)象的復(fù)用心赶。
  7. 組合(Composite)模式:將對(duì)象組合成樹(shù)狀層次結(jié)構(gòu),使用戶對(duì)單個(gè)對(duì)象和組合對(duì)象具有一致的訪問(wèn)性缺猛。
  • 行為型模式

  1. 模板方法(TemplateMethod)模式:定義一個(gè)操作中的算法骨架缨叫,而將算法的一些步驟延遲到子類中椭符,使得子類可以不改變?cè)撍惴ńY(jié)構(gòu)的情況下重定義該算法的某些特定步驟。
  2. 策略(Strategy)模式:定義了一系列算法耻姥,并將每個(gè)算法封裝起來(lái)销钝,使它們可以相互替換,且算法的改變不會(huì)影響使用算法的客戶琐簇。
  3. 命令(Command)模式:將一個(gè)請(qǐng)求封裝為一個(gè)對(duì)象蒸健,使發(fā)出請(qǐng)求的責(zé)任和執(zhí)行請(qǐng)求的責(zé)任分割開(kāi)。
    職責(zé)鏈(Chain of Responsibility)模式:把請(qǐng)求從鏈中的一個(gè)對(duì)象傳到下一個(gè)對(duì)象婉商,直到請(qǐng)求被響應(yīng)為止似忧。通過(guò)這種方式去除對(duì)象之間的耦合。
  4. 狀態(tài)(State)模式:允許一個(gè)對(duì)象在其內(nèi)部狀態(tài)發(fā)生改變時(shí)改變其行為能力丈秩。
  5. 觀察者(Observer)模式:多個(gè)對(duì)象間存在一對(duì)多關(guān)系盯捌,當(dāng)一個(gè)對(duì)象發(fā)生改變時(shí),把這種改變通知給其他多個(gè)對(duì)象蘑秽,從而影響其他對(duì)象的行為饺著。
  6. 中介者(Mediator)模式:定義一個(gè)中介對(duì)象來(lái)簡(jiǎn)化原有對(duì)象之間的交互關(guān)系,降低系統(tǒng)中對(duì)象間的耦合度筷狼,使原有對(duì)象之間不必相互了解瓶籽。
  7. 迭代器(Iterator)模式:提供一種方法來(lái)順序訪問(wèn)聚合對(duì)象中的一系列數(shù)據(jù)匠童,而不暴露聚合對(duì)象的內(nèi)部表示埂材。
  8. 訪問(wèn)者(Visitor)模式:在不改變集合元素的前提下,為一個(gè)集合中的每個(gè)元素提供多種訪問(wèn)方式汤求,即每個(gè)元素有多個(gè)訪問(wèn)者對(duì)象訪問(wèn)俏险。
  9. 備忘錄(Memento)模式:在不破壞封裝性的前提下,獲取并保存一個(gè)對(duì)象的內(nèi)部狀態(tài)扬绪,以便以后恢復(fù)它竖独。
  10. 解釋器(Interpreter)模式:提供如何定義語(yǔ)言的文法,以及對(duì)語(yǔ)言句子的解釋方法挤牛,即解釋器莹痢。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市墓赴,隨后出現(xiàn)的幾起案子竞膳,更是在濱河造成了極大的恐慌,老刑警劉巖诫硕,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件坦辟,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡章办,警方通過(guò)查閱死者的電腦和手機(jī)锉走,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)滨彻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人挪蹭,你說(shuō)我怎么就攤上這事亭饵。” “怎么了梁厉?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵冬骚,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我懂算,道長(zhǎng)只冻,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任计技,我火速辦了婚禮喜德,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘垮媒。我一直安慰自己舍悯,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布睡雇。 她就那樣靜靜地躺著萌衬,像睡著了一般。 火紅的嫁衣襯著肌膚如雪它抱。 梳的紋絲不亂的頭發(fā)上秕豫,一...
    開(kāi)封第一講書(shū)人閱讀 51,679評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音观蓄,去河邊找鬼混移。 笑死,一個(gè)胖子當(dāng)著我的面吹牛侮穿,可吹牛的內(nèi)容都是我干的歌径。 我是一名探鬼主播,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼亲茅,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼回铛!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起克锣,我...
    開(kāi)封第一講書(shū)人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤茵肃,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后娶耍,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體免姿,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年榕酒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了胚膊。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片故俐。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖紊婉,靈堂內(nèi)的尸體忽然破棺而出药版,到底是詐尸還是另有隱情,我是刑警寧澤喻犁,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布槽片,位于F島的核電站,受9級(jí)特大地震影響肢础,放射性物質(zhì)發(fā)生泄漏还栓。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一传轰、第九天 我趴在偏房一處隱蔽的房頂上張望剩盒。 院中可真熱鬧,春花似錦慨蛙、人聲如沸辽聊。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)跟匆。三九已至,卻和暖如春通砍,著一層夾襖步出監(jiān)牢的瞬間玛臂,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工埠帕, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留垢揩,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓敛瓷,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親斑匪。 傳聞我的和親對(duì)象是個(gè)殘疾皇子呐籽,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

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