單一職責原則
不要存在多余一個導致類變更的原因,通俗講就是,一個類只負責一項職責。遵循單一職責的優(yōu)點有:
- 降低類的復雜度
- 提高類的可讀性,提高系統(tǒng)的可維護性
- 變更引起的風險降低
單一職責并不是面向?qū)ο缶幊趟枷胨赜械?,只要模塊化的程序設(shè)計,都適用單一職責原則。
里式替換原則
定義1:如果對每一個類型為T1的對象o1,都有類型為T2的對象o2,使得以T1定義的所有程序P在所有的對象o1都代換成O2時,程序P的行為沒有發(fā)生變化,那么類型T2是類型T1的子類型。
定義2:所有引用基類的地方必須能透明地使用其子類的對象。
問題由來:有一功能P1,有類A完成。現(xiàn)需要將功能P1進行擴展,擴展后的功能為P,其中P由原有功能P1與新功能P2組成。新功能P由類A的子類B來完成,則在子類B完成新功能P2的時候,有可能導致原有功能P1發(fā)生故障。
解決方案:當使用繼承時,遵循里式替換原則。類B繼承A類時,除添加新的方法完成新的功能P2外,盡量不要重寫父類A的方法,也盡量不要重載父類A的方法。
里式替換原則通俗來講就是:子類可以擴展父類的功能,但不能改變父類原有的功能,包含以下4層含義:
- 子類可以實現(xiàn)父類的抽象方法,但不能覆蓋父類的非抽象方法
- 子類中可以增加自己特有的方法
- 當子類重載父類方法時,方法的前置條件(即方法的形參)要比父類方法的輸入?yún)?shù)更寬松
- 子類的方法實現(xiàn)父類的抽象方法時,方法的后置條件(即方法的返回值)要比父類更嚴格。
依賴倒置原則
定義:高層模塊不應該依賴低層模塊,二者都應該依賴其抽象,抽象不應該依賴細節(jié);細節(jié)應該依賴抽象。
依賴倒置的原則基于這樣一個事實:相對于細節(jié)的多變,抽象的東西要穩(wěn)定的多。以抽象為基礎(chǔ)搭建的架構(gòu)比以細節(jié)為基礎(chǔ)搭建起來的架構(gòu)要穩(wěn)定的多。在Java中,抽象指的是接口或抽象類,細節(jié)就是具體的實現(xiàn)類,使用接口或者抽象類的目的是制定好規(guī)范和契約,而不去涉及任何具體的操作,把戰(zhàn)線細節(jié)的任務交給他們的實現(xiàn)類去完成。
依賴倒置原則的核心思想就是面向接口編程。傳遞依賴關(guān)系的方法有三種:
- 接口傳遞
- 構(gòu)造方法傳遞
- setter方法傳遞
在實際編程中,我們一般需要做到如下3點: - 低層模塊盡量都要有抽象類或接口,或者兩者都有
- 變量的聲明類型盡量是抽象類或者接口
- 使用繼承時遵循里式替換原則。
接口隔離原則
客戶端不應該依賴它不需要的接口;一個類對另一個類的依賴應該建立在最小的接口上。
接口隔離原則的含義是:建立單一接口,不要建立龐大臃腫的接口,盡量細化接口,接口中的方法盡量少。采用接口隔離原則對接口進行約束時,要注意一下幾點:
- 接口盡量小,但是要有限度
- 為依賴接口的類定制服務,只暴露給調(diào)用的類需要的方法,它不需要的方法則隱藏起來
- 提高內(nèi)聚,減少對外交互。是接口用最少的方法去完成最多的事情。
- 運用接口隔離原則,一定要適度,接口設(shè)計的過大或過小都不好。
迪米特法則
一個對象應該對其他對象保持最少的了解,盡量降低類與類之間的耦合。迪米特法則又稱最少知道法則,它的初衷是降低類之間的耦合,但凡事都要有度,雖然可以避免與非直接的類通訊,但是要通訊,必然會通過一個“中介”來發(fā)生聯(lián)系,這樣會導致大量的中介和傳遞類,導致系統(tǒng)復雜度增大。
開閉原則
一個軟件實體如類、模塊和函數(shù)應該對擴展開發(fā),對修改關(guān)閉。
開閉原則是面向?qū)ο笤O(shè)計中最基礎(chǔ)的設(shè)計原則,它指導我們?nèi)绾谓⒎€(wěn)定靈活的系統(tǒng)。用抽象構(gòu)建框架,用實現(xiàn)擴展細節(jié),因為抽象靈活性好,適應性廣,只要抽象的合理,可以基本保持軟件系統(tǒng)的穩(wěn)定。
制定這個六個設(shè)計原則并不是要我們嚴格的遵守它們,而是需要根據(jù)實際情況靈活運用。