設(shè)計(jì)模式總結(jié)

設(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)的。
(本文主要是為了方便記憶,具體每個(gè)設(shè)計(jì)模式的內(nèi)容會(huì)以鏈接的方式出現(xiàn)在對(duì)應(yīng)的位置。)

七大原則

設(shè)計(jì)模式是依照七大原則設(shè)計(jì)出來(lái)的方案,掌握了七大原則,也就能在無(wú)形中使用設(shè)計(jì)模式。

  • 單一職責(zé)原則(SRP)
    單一職責(zé)原則,就一個(gè)類(lèi)而言,應(yīng)該僅有一個(gè)引起它變化的原因。
  • 開(kāi)放-封閉原則
    軟件實(shí)體(類(lèi)、模塊、函數(shù)等)應(yīng)該可以擴(kuò)展,但不可以修改。對(duì)于擴(kuò)展是開(kāi)放的,對(duì)于更改是封閉的。
  • 依賴(lài)倒轉(zhuǎn)原則
    抽象不應(yīng)該依賴(lài)細(xì)節(jié),細(xì)節(jié)應(yīng)該依賴(lài)于抽象。也就是說(shuō)要針對(duì)接口編程,不要對(duì)實(shí)現(xiàn)編程。
  • 里氏代換原則
    一個(gè)軟件實(shí)體如果使用的是一個(gè)父類(lèi)的話,那么一定適用于其子類(lèi),而且它察覺(jué)不出父類(lèi)對(duì)象和子類(lèi)對(duì)象的區(qū)別。也就是子類(lèi)型必須能夠替換掉它們的父類(lèi)型。
  • 迪米特法則
    迪米特法則,就是如果兩個(gè)類(lèi)不必彼此直接通信,那么這兩個(gè)類(lèi)就不應(yīng)當(dāng)發(fā)生直接的相互作用。如果其中一個(gè)類(lèi)需要調(diào)用另一個(gè)類(lèi)的,某一個(gè)方法的話,可以通過(guò)第三者轉(zhuǎn)發(fā)這個(gè)調(diào)用。
  • 合成/聚合復(fù)用原則
    盡量使用合成/聚合,盡量不用使用類(lèi)繼承(這是一種強(qiáng)耦合)。優(yōu)先使用對(duì)象的合成/聚合有助于保持每個(gè)類(lèi)被封裝,并被集中在單個(gè)任務(wù)上,這樣類(lèi)和類(lèi)繼承層次會(huì)保持比較小的規(guī)模,并且不大可能增長(zhǎng)為不可控制的龐然大物。
  • 接口隔離原則
    接口隔離原則(Interface Segregation Principle) ,應(yīng)當(dāng)為客戶端提供盡可能小的單獨(dú)的接口,而不是提供大的總的接口。

23種設(shè)計(jì)模式

設(shè)計(jì)模式可以分為三類(lèi):創(chuàng)建型模式、結(jié)構(gòu)型模式和行為型模式。

創(chuàng)建型模式

創(chuàng)建型模式是處理對(duì)象創(chuàng)建的設(shè)計(jì)模式,試圖根據(jù)實(shí)際情況使用合適的方式創(chuàng)建對(duì)象。創(chuàng)建型模式有:工廠方法模式、抽象工廠模式、建造者模式、原型模式、單例模式。

1. 抽象工廠模式

抽象工廠模式是提供一個(gè)創(chuàng)建一系列相關(guān)或相互依賴(lài)對(duì)象的接口,而無(wú)需指定它們具體的類(lèi)。


image

2. 建造者模式

建造者模式,就是將一個(gè)復(fù)雜對(duì)象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過(guò)程可以創(chuàng)建不同的表示。
建造者模式主要用于創(chuàng)建一些復(fù)雜的對(duì)象,這些對(duì)象內(nèi)部構(gòu)建間的構(gòu)造順序通常是穩(wěn)定的,但對(duì)象內(nèi)部的構(gòu)建通常面臨著復(fù)雜的變化。


image

3. 工廠方法模式

工廠方法模式定義了一個(gè)用于創(chuàng)建對(duì)象的接口,讓子類(lèi)決定實(shí)例化哪一個(gè)類(lèi)。


image

4. 單例模式

單例模式,就說(shuō)保證一個(gè)類(lèi)僅有一個(gè)實(shí)例,并提供一個(gè)訪問(wèn)它的全局訪問(wèn)點(diǎn)。


image

5. 原型模式

原型模式,用原型實(shí)例指定創(chuàng)建對(duì)象的種類(lèi),并且通過(guò)拷貝這些原型創(chuàng)建新的對(duì)象。


image

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

結(jié)構(gòu)型模式主要是用于處理類(lèi)或者對(duì)象的組合,它描述了如何使類(lèi)或者對(duì)象更好的組合起來(lái),是從程序的結(jié)構(gòu)上來(lái)解決模塊之間的耦合問(wèn)題。結(jié)構(gòu)型模式有:適配器模式、橋接模式、組合模式、裝飾模式、外觀模式、享元模式、代理模式。

1. 適配器模式

適配器模式,是將一個(gè)類(lèi)的接口轉(zhuǎn)換成客戶希望的另外一個(gè)接口。適配器模式使得原本由于接口不兼容而不能一起工作的那些類(lèi)可以一起工作。
系統(tǒng)的數(shù)據(jù)和行為都正確,但接口不符時(shí),我們應(yīng)該考慮用適配器。


image

2. 橋接模式

橋接模式,將抽象部分與它的實(shí)現(xiàn)部分分離,使它們都可以獨(dú)立地變化。


image

3. 組合模式

組合模式,就是將對(duì)象組合成樹(shù)形結(jié)構(gòu)以表示‘部分-整體’的層次結(jié)構(gòu)。組合模式使得用戶對(duì)單個(gè)對(duì)象和組合對(duì)象的使用具有一致性。
需求中體現(xiàn)部分與整體層次的結(jié)構(gòu)時(shí),或希望用戶可以忽略組合對(duì)象與單個(gè)對(duì)象的不同,統(tǒng)一地使用組合結(jié)構(gòu)中的所有對(duì)象時(shí),就應(yīng)該考慮用組合模式了。


image

4. 裝飾模式

裝飾模式,動(dòng)態(tài)地給一個(gè)對(duì)象添加一些額外的職責(zé),就增加功能而言,裝飾模式比生成子類(lèi)更為靈活。
當(dāng)系統(tǒng)需要增加新功能時(shí),如果向舊的類(lèi)中添加新的代碼,通常這些代碼是裝飾了原有類(lèi)的核心職責(zé)或主要行為,它們?cè)谥黝?lèi)中加入了新的字段、新的方法和新的邏輯,從而增加了主類(lèi)的復(fù)雜度,而這些新加入的代碼僅僅只是為了滿足一些只在某種特定情況下才會(huì)執(zhí)行的特殊行為的需求。這時(shí)裝飾模式就是一個(gè)非常好的解決方案,它把每個(gè)要裝飾的功能放在單獨(dú)的類(lèi)中,并讓這個(gè)類(lèi)包裝它所要裝飾的對(duì)象,因此,當(dāng)需要執(zhí)行特殊行為時(shí),客戶代碼就可以在運(yùn)行時(shí)根據(jù)需要有選擇、按順序地使用裝飾功能包裝對(duì)象了。


image

5. 外觀模式

外觀模式,為子系統(tǒng)中的一組接口提供一個(gè)一致的界面,此模式定義了一個(gè)高層接口,這個(gè)接口使得這一子系統(tǒng)更加容易使用。

  • 在設(shè)計(jì)初期階段,應(yīng)該要有意識(shí)的將不同的兩個(gè)層分離,在層與層之間建立外觀Facade,這樣可以為復(fù)雜的子系統(tǒng)提供一個(gè)簡(jiǎn)單的接口,使得耦合大大降低;
  • 在開(kāi)發(fā)階段,子系統(tǒng)往往因?yàn)椴粩嗟闹貥?gòu)演化而變得越來(lái)越復(fù)雜,增加外觀Facade可以提供一個(gè)簡(jiǎn)單的接口,減少它們之間的依賴(lài);
  • 在維護(hù)一個(gè)遺留的大型系統(tǒng)是,可能這個(gè)系統(tǒng)已經(jīng)非常難以維護(hù)和擴(kuò)展了,但新需求的開(kāi)發(fā)需要依賴(lài)這個(gè)系統(tǒng),則可以為新系統(tǒng)開(kāi)發(fā)一個(gè)外觀Facade類(lèi),來(lái)提供設(shè)計(jì)粗糙或高復(fù)雜度的遺留代碼的比較 清晰的簡(jiǎn)單接口,讓新系統(tǒng)與Facade對(duì)象交互,F(xiàn)acade與遺留代碼交互所有復(fù)雜的工作。


    image

6. 享元模式

享元模式,就是運(yùn)用共享技術(shù)有效地支持大量細(xì)粒度的對(duì)象。

  • 如果一個(gè)應(yīng)用程序使用了大量的對(duì)象,而這些對(duì)象造成了很大的存儲(chǔ)開(kāi)銷(xiāo)時(shí)就應(yīng)該考慮使用享元模式;
  • 對(duì)象的大多數(shù)狀態(tài)可以是外部狀態(tài),如果刪除對(duì)象的外部狀態(tài),那么可以用相對(duì)較少的共享對(duì)象取代很多組對(duì)象,此時(shí)可以考慮用享元模式。


    image

7. 代理模式

代理模式:為其他對(duì)象提供一種代理以控制對(duì)這個(gè)對(duì)象的訪問(wèn)。


image

行為型模式

行為型模式主要是用于描述類(lèi)或者對(duì)象是怎樣交互和怎樣分配職責(zé)的。它涉及到算法和對(duì)象間的職責(zé)分配,不僅描述對(duì)象或者類(lèi)的模式,還描述了他們之間的通信方式,它將你的注意力從控制流轉(zhuǎn)移到了對(duì)象間的關(guān)系上來(lái)。行為型類(lèi)模式采用繼承機(jī)制在類(lèi)間分派行為,而行為型對(duì)象模式使用對(duì)象復(fù)合而不是繼承。行為型類(lèi)模式有:職責(zé)鏈模式、命令模式、解釋器模式、迭代器模式、中介者模式、備忘錄模式、觀察者模式、狀態(tài)模式、策略模式、模板方法模式、訪問(wèn)者模式。

1. 職責(zé)鏈模式

職責(zé)鏈模式,就是使多個(gè)對(duì)象都有機(jī)會(huì)處理請(qǐng)求,從而避免請(qǐng)求的發(fā)送者和接受者之間的耦合關(guān)系。將這個(gè)對(duì)象連成一條鏈,并沿著這條鏈傳遞該請(qǐng)求,直到有一個(gè)對(duì)象處理它為止。


image

2. 命令模式

命令模式,是將一個(gè)請(qǐng)求封裝為一個(gè)對(duì)象,從而使我們可以用不同的請(qǐng)求對(duì)客戶進(jìn)行參數(shù)化、對(duì)請(qǐng)求排隊(duì)或記錄請(qǐng)求日志,以及支持可撤銷(xiāo)的操作。


image

3. 解釋器模式

解釋器模式,給定一個(gè)語(yǔ)言,定義它的文法的一種表示,并定義一個(gè)解釋器,這個(gè)解釋器使用該表示來(lái)解釋語(yǔ)言中的句子。


image

4. 迭代器模式

迭代器模式,提供了一種方法順序訪問(wèn)一個(gè)聚合對(duì)象中各個(gè)元素,而不暴露該對(duì)象的內(nèi)部表示。

  • 當(dāng)需要訪問(wèn)一個(gè)聚合對(duì)象,而且不管這些對(duì)象時(shí)什么都需要遍歷的時(shí)候,就該考慮迭代器模式;
  • 需要對(duì)聚集有多種方式遍歷時(shí),可以考慮用迭代器模式。


    image

5. 中介者模式

中介者模式,就是用一個(gè)中介對(duì)象來(lái)封裝一系列的對(duì)象交互。中介者使各對(duì)象不需要顯示地相互引用,從而使其耦合松散,而且可以獨(dú)立地改變它們之間的交互。
中介者模式一般用于一組對(duì)象以定義良好但是復(fù)雜的方式進(jìn)行通信的場(chǎng)合,以及想定制一個(gè)分布在多個(gè)類(lèi)中的行為,而又不想生成太多的子類(lèi)的場(chǎng)合。


image

6. 備忘錄模式

備忘錄模式,在不破壞封裝性的前提下,捕獲一個(gè)對(duì)象的內(nèi)部狀態(tài),并在該對(duì)象之外保存這個(gè)狀態(tài)。這樣以后就可將該對(duì)象恢復(fù)到原先保存的狀態(tài)。
Memento模式比較適用于功能比較復(fù)雜的,但需要維護(hù)或記錄屬性歷史的類(lèi),或者需要保存的屬性只是眾多屬性中的一小部分時(shí),Originator可以根據(jù)保存的Memento信息還原到前一狀態(tài)。


image

7. 觀察者模式

觀察者模式定義了一種一對(duì)多的依賴(lài)關(guān)系,讓多個(gè)觀察者對(duì)象同時(shí)監(jiān)聽(tīng)某一個(gè)主題對(duì)象。這個(gè)主題對(duì)象在狀態(tài)發(fā)生變化時(shí),會(huì)通知所有觀察者對(duì)象,使它們能夠自動(dòng)更新自己。

  • 當(dāng)一個(gè)對(duì)象的改變需要同時(shí)改變其他對(duì)象,且不知道具體有多少對(duì)象有待改變時(shí),應(yīng)該考慮使用觀察者模式;
  • 一個(gè)抽象模型有兩個(gè)方面,其中一方面依賴(lài)于另一方面,這時(shí)可以用觀察者模式將這兩者封裝在獨(dú)立的對(duì)象中使它們各自獨(dú)立地改變和復(fù)用。


    image

8. 狀態(tài)模式

狀態(tài)模型,就是當(dāng)一個(gè)對(duì)象的內(nèi)在狀態(tài)改變時(shí)允許改變其行為,這個(gè)對(duì)象看起來(lái)像是改變了其類(lèi)。
狀態(tài)模式通過(guò)把各種狀態(tài)轉(zhuǎn)換轉(zhuǎn)移邏輯分布到State的子類(lèi)之間,來(lái)減少相互間的依賴(lài)。當(dāng)一個(gè)對(duì)象的行為取決于它的狀態(tài),并且它必須在運(yùn)行時(shí)根據(jù)狀態(tài)改變它的行為時(shí),就可以考慮使用狀態(tài)模式了。


image

9. 策略模式

策略模式定義了算法家族,分別封裝起來(lái),讓它們之間可以互相轉(zhuǎn)換,此模式讓算法的變化,不會(huì)影響到使用算法的用戶。
模式策略是一種定義一系列算法的方法,從概念上看,所有這些算法完成的都是相同的工作,只是實(shí)現(xiàn)不同,它可以以相同的方式調(diào)用所有的算法,減少了各種算法類(lèi)與使用算法類(lèi)之間的耦合。實(shí)踐中只要在分析過(guò)程出現(xiàn)需要在不同時(shí)間應(yīng)用不同的業(yè)務(wù)規(guī)則,就可以考慮使用策略模式。


image

10. 模板方法模式

模版方法模式,就是定義一個(gè)操作中的算法的骨架,而將一些步驟延遲到子類(lèi)中。模版方法使得子類(lèi)可以不改變一個(gè)算法的結(jié)構(gòu)即可重定義該算法的某些特定步驟。
當(dāng)我們要完成在某一細(xì)節(jié)層次一致的一個(gè)過(guò)程或一系列步驟,但其個(gè)別步驟在更詳細(xì)的層次上的實(shí)現(xiàn)可能不同時(shí),通常考慮用模板方法模式來(lái)處理。


image

11. 訪問(wèn)者模式

訪問(wèn)者模式,表示一個(gè)作用于某對(duì)象結(jié)構(gòu)中的各元素的操作。它使你可以在不改變各元素的類(lèi)的前提下定義作用于這些元素的新操作。
訪問(wèn)者模式的目的是要把處理數(shù)據(jù)結(jié)構(gòu)分離出來(lái)。如果系統(tǒng)可以按照算法和數(shù)據(jù)結(jié)構(gòu)分開(kāi),且有比較穩(wěn)定的數(shù)據(jù)結(jié)構(gòu),又有易于變化的算法的話,使用訪問(wèn)者模式就是比較合適的,因?yàn)樵L問(wèn)者模式使用使得算法操作的增加變得容易。


image
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,363評(píng)論 6 532
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,497評(píng)論 3 416
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 176,305評(píng)論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 62,962評(píng)論 1 311
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,727評(píng)論 6 410
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 55,193評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,257評(píng)論 3 441
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 42,411評(píng)論 0 288
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,945評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,777評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,978評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,519評(píng)論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,216評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 34,642評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 35,878評(píng)論 1 286
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,657評(píng)論 3 391
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,960評(píng)論 2 373

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