設(shè)計(jì)模式的分類和六大原則,掃盲!
點(diǎn)擊上方藍(lán)色字體,選擇“標(biāo)星公眾號(hào)”
優(yōu)質(zhì)文章,第一時(shí)間送達(dá)
設(shè)計(jì)模式的分類
總的來(lái)說(shuō),設(shè)計(jì)模式分位三大類:
創(chuàng)建型模式(5種)
工廠方法模式、抽象工廠模式、單例模式、建造者模式、原型模式結(jié)構(gòu)型模式(7種)
適配器模式、裝飾器模式、代理模式、外觀模式(門面模式)、橋接模式、組合模式、享元模式行為型模式(11種)
策略模式、模板方法模式、觀察者模式、迭代器模式、責(zé)任鏈模式、命令模式、備忘錄模式、狀態(tài)模式、訪問(wèn)者模式、中介者模式、解釋器模式
六大原則
總原則:開(kāi)閉原則
定義:一個(gè)軟件實(shí)體應(yīng)該對(duì)擴(kuò)展開(kāi)放,對(duì)修改關(guān)閉。
當(dāng)一個(gè)軟件實(shí)體需要擴(kuò)展的時(shí)候,不要去修改原有的代碼,而是去擴(kuò)展原有的代碼。
開(kāi)閉原則是最基礎(chǔ)的一個(gè)原則,六大原則都是開(kāi)閉原則的具體形態(tài)。
采用開(kāi)閉原則的原因:
避免測(cè)試復(fù)雜化:
通過(guò)擴(kuò)展實(shí)現(xiàn)變化,測(cè)試只需要對(duì)新增類進(jìn)行單元測(cè)試即可,只需要保證新類提供的方法正確就行。提高代碼復(fù)用性:
避免以后為了修改一個(gè)微小的缺陷或增加新功能,卻要在整個(gè)項(xiàng)目中到處查找相關(guān)的代碼逐一修改。提高可維護(hù)性:
開(kāi)發(fā)新功能時(shí),擴(kuò)展一個(gè)類往往比修改一個(gè)類更容易。
1. 單一職責(zé)原則
定義:有且僅有一個(gè)原因引起類的變更
優(yōu)點(diǎn):
類的復(fù)雜性降低
可讀性提高
易維護(hù)
修改類引起的風(fēng)險(xiǎn)降低
臨界點(diǎn):
過(guò)度的劃分會(huì)使類劇增,增加系統(tǒng)的復(fù)雜度
2. 里氏代換原則
定義:所有引用基類的地方必須能透明地使用其子類的對(duì)象
優(yōu)點(diǎn):
提高代碼的重用性
提高代碼的可拓展性
提高項(xiàng)目的開(kāi)放性
缺點(diǎn):
記成是入侵式的,只要繼承,就有父類的屬性和方法
降低代碼靈活性,子類多了父類的約束
增強(qiáng)耦合性,父類的常量/變量/方法改動(dòng)時(shí),必須考慮子類的修改
四層含義:
子類可以實(shí)現(xiàn)父類的抽象方法,但不能覆蓋父類的非抽象方法。
子類中可以增加自己特有的方法。
當(dāng)子類的方法重載父類的方法時(shí),方法的前置條件(即方法的形參)要比父類方法的輸入?yún)?shù)更寬松。
當(dāng)子類的方法實(shí)現(xiàn)父類的抽象方法時(shí),方法的后置條件(即方法的返回值)要比父類更嚴(yán)格。
3. 依賴倒轉(zhuǎn)原則
定義:
高層模塊不應(yīng)該依賴低層模塊,兩者都要依賴其抽象(模塊間的依賴通過(guò)抽象產(chǎn)生,實(shí)現(xiàn)類不直接發(fā)生依賴)
抽象不應(yīng)該依賴細(xì)節(jié)(接口或者抽象類不依賴實(shí)現(xiàn)類)
細(xì)節(jié)可以依賴抽象(實(shí)現(xiàn)類依賴接口或抽象類)
處理:
每個(gè)類盡量都有接口或者抽象類
變量的表面類型盡量是接口或者抽象類
任何類都不應(yīng)該從具體類派生
盡量不要復(fù)寫基類已實(shí)現(xiàn)的方法
結(jié)合里氏替換原則使用
4. 依賴倒轉(zhuǎn)原則
定義:客戶端不應(yīng)該依賴不需要的接口,類之間的依賴關(guān)系應(yīng)該建立在最小的接口上
四層含義:
接口盡量小,不要出現(xiàn)臃腫的接口
接口要高內(nèi)聚
只提供訪問(wèn)者需要的方法,每個(gè)接口中不存在子類用不到卻必須要實(shí)現(xiàn)的內(nèi)容,可以將接口拆分
接口設(shè)計(jì)限度:設(shè)計(jì)粒度越小系統(tǒng)越靈活,結(jié)構(gòu)會(huì)越復(fù)雜,可維護(hù)性降低
處理:
一個(gè)接口只服務(wù)一個(gè)子模塊或者業(yè)務(wù)邏輯
盡量壓縮接口內(nèi)的方法,保證都是有用的,避免臃腫
已被污染的接口盡量去修改,若變更風(fēng)險(xiǎn)大,采用適配器模式轉(zhuǎn)化處理
深入了解業(yè)務(wù)邏輯
5. 迪米特法則(最少知道原則)
定義:一個(gè)對(duì)象應(yīng)該對(duì)其他對(duì)象有最小的了解(低耦合)
含義:
方法盡量不引入類中不存在的對(duì)象
盡量不要暴露過(guò)多public方法和非晶態(tài)public變量,盡量?jī)?nèi)斂
如果一個(gè)方法放在本類中,既不增加類間的關(guān)系,也不對(duì)本類產(chǎn)生負(fù)面影響,就可放置在本類中
總結(jié):
核心觀念就是類間解耦,低耦合。其負(fù)面影響就是產(chǎn)生了大量的中轉(zhuǎn)或者跳轉(zhuǎn)類,導(dǎo)致系統(tǒng)復(fù)雜性提高,也為維護(hù)帶來(lái)了難度。需要反復(fù)權(quán)衡,既做到結(jié)構(gòu)清晰,又要高內(nèi)聚低耦合。
如果一個(gè)類需要跳轉(zhuǎn)兩次以上才能訪問(wèn)到另一個(gè)類,就需要想辦法重構(gòu)了。
6. 合成復(fù)用原則
定義:是在一個(gè)新的對(duì)象里面使用一些已有的對(duì)象,使其成為新對(duì)象的一部分。新對(duì)象通過(guò)委派達(dá)到復(fù)用已有功能的效果。
優(yōu)點(diǎn):
使用對(duì)象的合成/聚合將有助于保持每個(gè)類被封裝,并被集中在單個(gè)任務(wù)上。這樣類和集成層次會(huì)保持較小規(guī)模,并且不太可能增長(zhǎng)為不可控制的龐然大物
缺點(diǎn):
通過(guò)這種方式復(fù)用建造的系統(tǒng)會(huì)有較多的對(duì)象需要管理;為了能將多個(gè)不同的對(duì)象作為組合塊來(lái)使用,必須仔細(xì)地對(duì)接口進(jìn)行定義
