設(shè)計(jì)模式是軟件開發(fā)人員在軟件開發(fā)過(guò)程中面臨的一般問(wèn)題的解決方案努隙。這些解決方案是眾多軟件開發(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ì)模式是為了重用代碼、讓代碼更容易被他人理解拨匆、保證代碼可靠性姆涩。
設(shè)計(jì)模式可以完美地解決很多問(wèn)題,每種模式在現(xiàn)實(shí)中都有相應(yīng)的原理來(lái)與之對(duì)應(yīng)惭每,每種模式都描述了一個(gè)在我們周圍不斷重復(fù)發(fā)生的問(wèn)題骨饿,以及該問(wèn)題的核心解決方案。
六大原則
單一職責(zé)原則 SRP(Single Responsibility Principle)
一個(gè)類只負(fù)責(zé)一個(gè)功能領(lǐng)域的職責(zé)台腥。各個(gè)職責(zé)的程序改動(dòng)宏赘,不影響其它程序。
優(yōu)點(diǎn):降低類和類的耦合黎侈,提高可讀性察署,增加可維護(hù)性和可拓展性,降低可變性的風(fēng)險(xiǎn)蜓竹。
里氏替換原則 LSP(liskov substitution principle)
使用的基類可以在任何地方使用繼承的子類箕母,完美的替換基類储藐。子類可以擴(kuò)展父類的功能俱济,但不能改變父類原有的功能。子類可以實(shí)現(xiàn)父類的抽象方法钙勃,但不能覆蓋父類的非抽象方法蛛碌,子類中可以增加自己特有的方法。
優(yōu)點(diǎn):增加程序的健壯性辖源,即使增加了子類蔚携,原有的子類還可以繼續(xù)運(yùn)行希太,互不影響。
依賴倒置原則 DIP(dependence inversion principle)
要針對(duì)接口編程酝蜒,而不是針對(duì)實(shí)現(xiàn)編程誊辉。高層次的模塊不應(yīng)該依賴于低層次的模塊,他們都應(yīng)該依賴于抽象亡脑,抽象不應(yīng)該依賴于具體實(shí)現(xiàn)堕澄,具體實(shí)現(xiàn)應(yīng)該依賴于抽象。
優(yōu)點(diǎn):可以減少需求變化帶來(lái)的工作量霉咨,做并行開發(fā)更加友好蛙紫。
接口隔離原則 ISP(interface segregation principle)
類和類之間應(yīng)該建立在最小接口的上。使用多個(gè)專門的接口途戒,而不使用單一的總接口坑傅,即客戶端不應(yīng)該依賴那些它不需要的接口。每一個(gè)接口應(yīng)該承擔(dān)一種相對(duì)獨(dú)立的角色喷斋。注意控制接口的粒度.
優(yōu)點(diǎn):提高程序的靈活度唁毒,提高內(nèi)聚,減少對(duì)外交互星爪,使得最小的接口做最多的事情枉证。
迪米特法則(law of demeter LOD)
一個(gè)對(duì)象應(yīng)當(dāng)對(duì)其他對(duì)象有盡可能少地關(guān)聯(lián),簡(jiǎn)稱類間解耦移必。一個(gè)類盡量減少自己對(duì)其他對(duì)象的依賴室谚,原則是低耦合,高內(nèi)聚崔泵,只有使各個(gè)模塊之間的耦合盡量的低秒赤,才能提高代碼的復(fù)用率。
優(yōu)點(diǎn):低耦合憎瘸,高內(nèi)聚入篮。使類與類之間保持松散的耦合關(guān)系。
開放封閉原則(open closed principle)
思想:盡量通過(guò)擴(kuò)展軟件實(shí)體來(lái)解決需求變化幌甘,而不是通過(guò)修改已有的代碼來(lái)完成變化潮售。一個(gè)軟件實(shí)體應(yīng)當(dāng)對(duì)擴(kuò)展開放,對(duì)修改關(guān)閉锅风。
優(yōu)點(diǎn):?jiǎn)我辉瓌t告訴我們酥诽,每個(gè)類都有自己負(fù)責(zé)的職責(zé),里氏替換原則不能破壞繼承關(guān)系的體系皱埠。
23 種設(shè)計(jì)模式
創(chuàng)建型模式
主要特點(diǎn)是“將對(duì)象的創(chuàng)建與使用分離”肮帐。可以降低系統(tǒng)的耦合度,使用者不需要關(guān)注對(duì)象的創(chuàng)建細(xì)節(jié)训枢,對(duì)象的創(chuàng)建由相關(guān)的工廠來(lái)完成托修。
- 工廠模式(Factory):定義一個(gè)用于創(chuàng)建產(chǎn)品的接口,由子類決定生產(chǎn)什么產(chǎn)品恒界。
- 抽象工廠模式(Abstract Factory):提供一個(gè)創(chuàng)建產(chǎn)品族的接口皱卓,其每個(gè)子類可以生產(chǎn)一系列相關(guān)的產(chǎn)品墓卦。
- 單例模式(Singleton):某個(gè)類只能生成一個(gè)實(shí)例枚粘,該類提供了一個(gè)全局訪問(wèn)點(diǎn)供外部獲取該實(shí)例吨拍,其拓展是有限多例模式。
- 建造者模式(Builder):將一個(gè)復(fù)雜對(duì)象分解成多個(gè)相對(duì)簡(jiǎn)單的部分婆誓,然后根據(jù)不同需要分別創(chuàng)建它們吃环,最后構(gòu)建成該復(fù)雜對(duì)象。
- 原型模式(Prototype):將一個(gè)對(duì)象作為原型洋幻,通過(guò)對(duì)其進(jìn)行復(fù)制而克隆出多個(gè)和原型類似的新實(shí)例郁轻。
結(jié)構(gòu)型模式
關(guān)注類和對(duì)象的組合,采用繼承的概念來(lái)組合接口和定義組合對(duì)象文留。它分為類結(jié)構(gòu)型模式和對(duì)象結(jié)構(gòu)型模式好唯,前者采用繼承機(jī)制來(lái)組織接口和類,后者釆用組合或聚合來(lái)組合對(duì)象燥翅。
- 適配器模式(Adapter):將一個(gè)類的接口轉(zhuǎn)換成客戶希望的另外一個(gè)接口骑篙,使得原本由于接口不兼容而不能一起工作的那些類能一起工作。
- 橋接模式(Bridge):將抽象與實(shí)現(xiàn)分離森书,使它們可以獨(dú)立變化靶端。它是用組合關(guān)系代替繼承關(guān)系來(lái)實(shí)現(xiàn)的,從而降低了抽象和實(shí)現(xiàn)這兩個(gè)可變維度的耦合度凛膏。
- 組合模式(Composite):將對(duì)象組合成樹狀層次結(jié)構(gòu)杨名,使用戶對(duì)單個(gè)對(duì)象和組合對(duì)象具有一致的訪問(wèn)性。
- 裝飾器模式(Decorator):動(dòng)態(tài)地給對(duì)象增加一些職責(zé)猖毫,即增加其額外的功能台谍。
- 外觀模式(Facade):為多個(gè)復(fù)雜的子系統(tǒng)提供一個(gè)一致的接口,使這些子系統(tǒng)更加容易被訪問(wèn)吁断。
- 享元模式(Flyweight):運(yùn)用共享技術(shù)來(lái)有效地支持大量細(xì)粒度對(duì)象的復(fù)用趁蕊。
- 代理模式(Proxy ):為某對(duì)象提供一種代理以控制對(duì)該對(duì)象的訪問(wèn)。即客戶端通過(guò)代理間接地訪問(wèn)該對(duì)象仔役,從而限制掷伙、增強(qiáng)或修改該對(duì)象的一些特性。
行為型模式
行為型模式用于描述程序在運(yùn)行時(shí)復(fù)雜的流程控制骂因,即描述多個(gè)類或?qū)ο笾g怎樣相互協(xié)作共同完成單個(gè)對(duì)象都無(wú)法單獨(dú)完成的任務(wù)炎咖,它涉及算法與對(duì)象間職責(zé)的分配。
行為型模式分為類行為模式和對(duì)象行為模式寒波,前者采用繼承機(jī)制來(lái)在類間分派行為乘盼,后者采用組合或聚合在對(duì)象間分配行為。
- 模板方法(Template)模式:定義一個(gè)操作中的算法骨架俄烁,將算法的一些步驟延遲到子類中绸栅,使得子類在可以不改變?cè)撍惴ńY(jié)構(gòu)的情況下重定義該算法的某些特定步驟。
- 策略(Strategy)模式:定義了一系列算法页屠,并將每個(gè)算法封裝起來(lái)粹胯,使它們可以相互替換,且算法的改變不會(huì)影響使用算法的客戶辰企。
- 命令(Command)模式:將一個(gè)請(qǐng)求封裝為一個(gè)對(duì)象风纠,使發(fā)出請(qǐng)求的責(zé)任和執(zhí)行請(qǐng)求的責(zé)任分割開。
- 職責(zé)鏈(Chain of Responsibility)模式:把請(qǐng)求從鏈中的一個(gè)對(duì)象傳到下一個(gè)對(duì)象牢贸,直到請(qǐng)求被響應(yīng)為止竹观。通過(guò)這種方式去除對(duì)象之間的耦合。
- 狀態(tài)(State)模式:允許一個(gè)對(duì)象在其內(nèi)部狀態(tài)發(fā)生改變時(shí)改變其行為能力潜索。
- 觀察者(Observer)模式:多個(gè)對(duì)象間存在一對(duì)多關(guān)系臭增,當(dāng)一個(gè)對(duì)象發(fā)生改變時(shí),把這種改變通知給其他多個(gè)對(duì)象竹习,從而影響其他對(duì)象的行為誊抛。
- 中介者(Mediator)模式:定義一個(gè)中介對(duì)象來(lái)簡(jiǎn)化原有對(duì)象之間的交互關(guān)系,降低系統(tǒng)中對(duì)象間的耦合度整陌,使原有對(duì)象之間不必相互了解拗窃。
- 迭代器(Iterator)模式:提供一種方法來(lái)順序訪問(wèn)聚合對(duì)象中的一系列數(shù)據(jù),而不暴露聚合對(duì)象的內(nèi)部表示泌辫。
- 訪問(wèn)者(Visitor)模式:在不改變集合元素的前提下并炮,為一個(gè)集合中的每個(gè)元素提供多種訪問(wèn)方式,即每個(gè)元素有多個(gè)訪問(wèn)者對(duì)象訪問(wèn)甥郑。
- 備忘錄(Memento)模式:在不破壞封裝性的前提下逃魄,獲取并保存一個(gè)對(duì)象的內(nèi)部狀態(tài),以便以后恢復(fù)它澜搅。
- 解釋器(Interpreter)模式:提供如何定義語(yǔ)言的文法伍俘,以及對(duì)語(yǔ)言句子的解釋方法,即解釋器勉躺。