之前一直斷斷續(xù)續(xù)的在看《設(shè)計模式之禪》蒸绩,但是一段時間不接觸便漸漸對一些概念性的東西模糊了头滔,再回過頭看來則會耗時耗力账千,畢竟設(shè)計模式這種東西猶如滴水穿石需持之以恒贝次,結(jié)合實(shí)際開發(fā)才能慢慢的爛熟于心成洗,所以決定將常用設(shè)計模式的精華部分摘記下來五督。下面以設(shè)計模式的六大原則開始,一一記之瓶殃,后面會根據(jù)筆記作一個目錄匯總充包。
設(shè)計模式中六大原則
開閉原則(OCP)
職責(zé)單一原則(SRP)
里氏替換原則(LSP)
依賴倒置原則(DIP)
接口隔離原則(ISP)
合成復(fù)用原則(CRP)
迪米特法則(LOD)
Open Close Principle
OCP原則(開閉原則):一個軟件實(shí)體如類、模塊和函數(shù)等應(yīng)該對拓展開發(fā)碌燕,對修改關(guān)閉误证。
注意
開閉原則對拓展開放,對修改關(guān)閉修壕,并不意味這不做任何的修改愈捅,低層次模塊的變化,必然要有高層模塊進(jìn)行耦合慈鸠,否則就是一個孤立無意義的代碼片段蓝谨。
在業(yè)務(wù)規(guī)則改變的情況下高層模塊必須有部分改變以適應(yīng)新業(yè)務(wù),改變要盡量地少青团,防止變化風(fēng)險的擴(kuò)散譬巫。 -秦小波 《設(shè)計模式之禪》
Single Responsibility Principle
SRP原則(職責(zé)單一原則):應(yīng)該有且只有一個原因引起類的變更。
注意
單一原則的職責(zé)劃分需要根據(jù)具體場景和項目業(yè)務(wù)邏輯來進(jìn)行判斷督笆。
Liskov Substitution Principle
OCP原則(里氏替換原則):所有引用基類的地方必須能透明地使用其子類的對象芦昔。
通俗點(diǎn)講:只要父類能出現(xiàn)的地方子類就可以出現(xiàn),而且替換為子類也不產(chǎn)生任何異常錯誤娃肿,反之則不然咕缎。這主要體現(xiàn)在,我們經(jīng)常使用抽象類/基類做為方法參數(shù)料扰,具體使用哪個子類作為參數(shù)傳入進(jìn)去凭豪,由調(diào)用者決定。
通俗點(diǎn)講晒杈,該原則包含以下幾點(diǎn)要素
子類必須完全實(shí)現(xiàn)父類的方法
子類可以有自己獨(dú)有的屬性和方法
覆蓋或者實(shí)現(xiàn)父類方法時嫂伞,參數(shù)可以被放大。即父類的某個方法參數(shù)為HashMap時,子類參數(shù)可以是HashMap帖努,也可以是Map或者更大
覆蓋或者實(shí)現(xiàn)父類的方法時撰豺,返回結(jié)果可以被縮小。即父類的某個方法返回類型是Map拼余,子類可以是Map郑趁,也可以是HashMap或者更小
Dependence Inversion Principle
DIP原則(依賴倒置原則):抽象不應(yīng)該依賴具體細(xì)節(jié),而應(yīng)該具體細(xì)節(jié)依賴于抽象姿搜,高層模塊不應(yīng)該依賴底層模塊。
底層模塊:不可分割的原子邏輯就是低層模塊
高層模塊:低層模塊的組裝合成后就是高層模塊
抽象:Java中體現(xiàn)為基類捆憎、抽象類舅柜、接口,而不單指抽象類
細(xì)節(jié):體現(xiàn)為子類躲惰、實(shí)現(xiàn)類
通俗點(diǎn)講致份,該原則包含以下幾點(diǎn)要素
模塊間的依賴應(yīng)該通過抽象發(fā)生,具體實(shí)現(xiàn)類之間不應(yīng)該建立依賴關(guān)系
接口或者抽象類不依賴于實(shí)現(xiàn)類础拨,否則就失去了抽象的意義
實(shí)現(xiàn)類依賴于接口或者抽象類
修改properties等文本配置文件氮块,不破壞依賴倒置原則
總結(jié)起來,一句話:“面向接口編程”诡宗。
Interface-Segregation Principle
ISP原則(接口隔離原則):客戶端不依賴它不需要的接口滔蝉;類間的依賴應(yīng)該建立在最小的接口。
通俗點(diǎn)講:使用接口時應(yīng)該建立單一接口塔沃,不要建立臃腫龐大的接口蝠引,盡量給調(diào)用者提供專門的接口,而非多功能接口蛀柴。(類似職責(zé)單一原則螃概,一個接口負(fù)責(zé)單個模塊或業(yè)務(wù))
Composite Reuse Principle
CRP原則(合成復(fù)用原則):盡量使用對象組合,而不是繼承來達(dá)到復(fù)用的目的鸽疾。合成復(fù)用原則又稱為組合/聚合復(fù)用原則吊洼。
Low of Demeter
LOD法則(迪米特法則):又稱最小知識原則(Least Knowledge Principle,LKP),一個對象應(yīng)該對其他對象有最少的了解。
該原則包含以下幾點(diǎn)要素
只和朋友類交流:只耦合該耦合的類
朋友間也是有距離的:減少不該public的方法制肮,向外提供一個簡潔的訪問
自家的方法就自己創(chuàng)建:只要該方法不會增加內(nèi)部的負(fù)擔(dān)冒窍,也不會增加類間耦合
通俗點(diǎn)講:一個類應(yīng)該對自己需要耦合或者調(diào)用的類知道越少越好,被耦合或者調(diào)用的類內(nèi)部和我沒有關(guān)系弄企,我不需要的東西你就別public了吧超燃。
七種常用面向?qū)ο笤O(shè)計原則,如下表所示:
設(shè)計原則名稱 | 定 義 | 使用頻率 |
---|---|---|
單一職責(zé)原則 (Single Responsibility Principle, SRP) | 一個類只負(fù)責(zé)一個功能領(lǐng)域中的相應(yīng)職責(zé) | ★★★★☆ |
開閉原則 (Open-Closed Principle, OCP) | 軟件實(shí)體應(yīng)對擴(kuò)展開放拘领,而對修改關(guān)閉 | ★★★★★ |
里氏代換原則 (Liskov Substitution Principle, LSP) | 所有引用基類對象的地方能夠透明地使用其子類的對象 | ★★★★★ |
依賴倒轉(zhuǎn)原則 (Dependence Inversion Principle, DIP) | 抽象不應(yīng)該依賴于細(xì)節(jié)意乓,細(xì)節(jié)應(yīng)該依賴于抽象 | ★★★★★ |
接口隔離原則 (Interface Segregation Principle, ISP) | 使用多個專門的接口,而不使用單一的總接口 | ★★☆☆☆ |
合成復(fù)用原則 (Composite Reuse Principle, CRP) | 盡量使用對象組合,而不是繼承來達(dá)到復(fù)用的目的 | ★★★★☆ |
迪米特法則 (Law of Demeter, LoD) | 一個軟件實(shí)體應(yīng)當(dāng)盡可能少地與其他實(shí)體發(fā)生相互作用 | ★★★☆☆ |