開閉原則
- 定義
軟件實體應(yīng)當(dāng)對擴展開放,對修改關(guān)閉。
當(dāng)應(yīng)用的需求改變時,在不修改軟件實體的源代碼或者二進(jìn)制代碼的前提下,可以擴展模塊的功能,使其滿足新的需求。 - 作用
降低對軟件測試的影響,只需要對擴展的代碼進(jìn)行測試即可。
增強穩(wěn)定性和延續(xù)性,從而易于擴展和維護(hù)。 - 舉例
Glide內(nèi)置了一些解碼實現(xiàn),這些實現(xiàn)對外是不開放的;
但是預(yù)留了各種接口,用戶可以通過注冊數(shù)據(jù)加載和解碼實現(xiàn),擴展所支持的解碼格式。
依賴倒置原則
- 定義
要面向接口編程,不要面向?qū)崿F(xiàn)編程。
簡單的說就是要求對抽象進(jìn)行編程,不要對實現(xiàn)進(jìn)行編程。 - 作用
降低了客戶與實現(xiàn)模塊間的耦合。
可以減少并行開發(fā)引起的風(fēng)險。 - 舉例
- 工程劃分模塊化后,模塊之前相互調(diào)用的部分,如果接口來調(diào)用。
- 實現(xiàn)SDK時,一些功能(如圖片加載,網(wǎng)絡(luò)請求,日志等)通過預(yù)留接口給外部去注入實現(xiàn),而非直接依賴實現(xiàn)。
比如需要加載圖片,可以定義ImageLoader接口,定義loadImage方法,而非引入某個圖片加載框架。
單一職責(zé)原則
- 定義
一個類應(yīng)該有且僅有一個引起它變化的原因,否則類應(yīng)該被拆分。
如果一個對象承擔(dān)了太多的職責(zé),至少存在以下兩個缺點
一個職責(zé)的變化可能會削弱或者抑制這個類實現(xiàn)其他職責(zé)的能力;
當(dāng)客戶端需要該對象的某一個職責(zé)時,不得不將其他不需要的職責(zé)全都包含進(jìn)來,從而造成冗余代碼或代碼的浪費。 - 作用
降低類的復(fù)雜度。
降低變更代碼所引起的風(fēng)險。
提高類的可讀性。
提高系統(tǒng)的可維護(hù)性。
接口隔離原則
- 定義
客戶端不應(yīng)該被迫依賴于它不使用的方法。一個類對另一個類的依賴應(yīng)該建立在最小的接口上。
與單一職責(zé)原則的區(qū)別:
單一職責(zé)原則注重的是職責(zé),而接口隔離原則注重的是對接口依賴的隔離。
單一職責(zé)原則主要是約束類,它針對的是程序中的實現(xiàn)和細(xì)節(jié);接口隔離原則主要約束接口,主要針對抽象和程序整體框架的構(gòu)建。 - 作用
能減少項目工程中的代碼冗余。
過大的大接口里面通常放置許多不用的方法,當(dāng)實現(xiàn)這個接口的時候,被迫設(shè)計冗余的代碼。 - 舉例
View的 OnClickListener 和 OnLongClickListener 等就是隔離的,不然開發(fā)者需要監(jiān)聽點擊事件還要同時實現(xiàn)各種其他事件的接口。
里氏替換原則
- 定義
繼承必須確?;愃鶕碛械男再|(zhì)在子類中仍然成立。
子類可以擴展父類的功能,但不能改變父類原有的功能。 - 作用
是實現(xiàn)開閉原則的重要方式之一。
克服了繼承中重寫父類造成的可復(fù)用性變差的缺點。
類的擴展不會給已有的系統(tǒng)引入新的錯誤,降低了代碼出錯的可能性。 - 舉例
繼承一些已經(jīng)現(xiàn)成的View, 需保持原來View的邏輯。
比如網(wǎng)上一些實現(xiàn)變色的TintXxxView的控件,其覆寫"setEnabled"等方法時,除了自己處理變色的邏輯之外,還會調(diào)用super.setEnabled()方法,因為要保持父類的處理。
迪米特法則 (最少知識原則)
- 定義
如果兩個軟件實體無須直接通信,那么就不應(yīng)當(dāng)發(fā)生直接的相互調(diào)用。
如果其中的一個類需要調(diào)用另一個類的某一個方法的話,可以通過第三者轉(zhuǎn)發(fā)這個調(diào)用。 - 作用
降低了類之間的耦合度,提高了模塊的相對獨立性。 - 舉例
觀察者模式。
合成復(fù)用原則 (組合/聚合復(fù)用原則)
- 定義
在軟件復(fù)用時,要盡量先使用組合或者聚合等關(guān)聯(lián)關(guān)系來實現(xiàn),其次才考慮使用繼承關(guān)系來實現(xiàn)。 - 作用
維持了類的封裝性, 不需要知道所引用的類的實現(xiàn)細(xì)節(jié)。
繼承是靜態(tài)復(fù)用,組合復(fù)用是動態(tài)復(fù)用,可動態(tài)地引用類型相同的對象。 - 舉例:
裝飾者模式。
總結(jié)
| 設(shè)計原則 | 歸納 |
|---|---|
| 開閉原則 | 對擴展開放,對修改關(guān)閉。 |
| 依賴倒置原則 | 要面向接口編程,不要面向?qū)崿F(xiàn)編程。 |
| 單一職責(zé)原則 | 一個類應(yīng)該有且僅有一個引起它變化的原因,否則類應(yīng)該被拆分。 |
| 接口隔離原則 | 一個類對另一個類的依賴應(yīng)該建立在最小的接口上。 |
| 里氏替換原則 | 繼承必須確?;愃鶕碛械男再|(zhì)在子類中仍然成立。 |
| 迪米特法則 | 如果兩個軟件實體無須直接通信,那么就不應(yīng)當(dāng)發(fā)生直接的相互調(diào)用。 |
| 合成復(fù)用原則 | 組合優(yōu)先于繼承。 |