用抽象構建框架,用實現擴展細節
1、單一職責原則(SRP)
核心思想:系統中每一個對象都應該只有一個單獨的職責,而所有對象所關注的就是自身指責的完成。
SRP就是我們所說的"高內聚、低耦合"
優點:消除耦合
可以降低類的複雜度,一個類只負責一項職責,其邏輯肯定要比負責多項職責簡單的多;提高類的可讀性,提高系統的可維護性;變更引起的風險降低,變更是必然的,如果單一職責原則遵守的好,當修改一個功能時,可以顯著降低對其他功能的影響。
2、里氏替換原則(LSP)
核心思想:在任何父類出現的地方都可以用子類來替代
LSP通俗的來講就是:子類可以擴展父類的功能,但不能改變父類原有的功能。它包含4層含義:
子類可以實現父類的抽象方法,但不能覆蓋父類的非抽象方法。子類中可以增加自己特有的方法。當子類的方法重載父類的方法時,方法的前置條件(即方法的形參)要比父類方法的輸入參數更寬鬆。當子類的方法實現父類的抽象方法時,方法的後置條件(即方法的返回值)要比父類更嚴格。LSP關注的是怎樣良好的使用繼承,也就是說不要濫用繼承,它是繼承複用的基石
經典”正方形不是矩形“的問題。
。。。
3、依賴倒置原則(DIP)
核心思想:要依賴於抽象,不要依賴於具體實現
DIP的意思是:在應用程序中,所有的類如果使用或依賴於其他的類,則都應該依賴於這些其他類的抽象類,而不是這些其他類的具體實現類。抽象層次應該不依賴於具體的實現細節,這樣才能保證系統的可複用性與可維護性。因此爲實現這一原則,我們要在編程時針對接口編程,而不針對實現編程。
低層模塊儘量都要有抽象類或接口,或者兩者都有。變量的聲明類型儘量是抽象類或接口。使用繼承時遵循里氏替換原則。
4、接口分離原則(ISP)
核心思想:不應該強迫客戶程序依賴它們不需要使用的方法
ISP的意思是:一個接口應該只提供一種對外的功能,不應該把所有的操作都封裝到一個接口中(這裏的接口分兩種:對象接口(類),類接口(Class Interface),P30)。
也就是說,ISP要求在一個模塊中應該只依賴它需要的接口,以保證接口的小純潔。而且需要接口儘量小,即設計接口時應儘量細化,不要定義太臃腫的接口。
與單一職責原則比較:
單一職責原則要求類與接口職責單一,注重的是職責,是業務邏輯上的劃分。而接口分離原則注重對接口依賴的隔離 單一職責原則主要是約束類,其次纔是接口和方法,它針對的是程序中的實現和細節;而接口分離原則主要約束接口,主要針對抽象,針對程序整體框架的構建
5、迪米特原則(LOD)-最少知識原則(LKP)
核心思想:一個對象應當對其他對象儘可能少的瞭解。即降低對象之間的耦合
更簡單的定義:只與直接的朋友通信--<觀察者模式?>
LOD的核心觀念是類間解耦,弱耦合。只有弱耦合了以後,類的複用性纔可以提高
過分的使用迪米特原則,會產生大量的中介和傳遞類,導致系統複雜度變大。所以在採用迪米特法則時要反覆權衡,既做到結構清晰,又要高內聚低耦合
6、開閉原則(OCP)
核心思想:一個對象應對擴展開放,對修改關閉
OCP的意思是:軟件需要變化時,儘量通過擴展軟件實體的行爲來實現變化,而不是通過修改已有的代碼。也就是說,開發人員一旦寫出了可以運行的代碼,就不應去改變它,而是要保證它能一直運行下去,如何做到這一點呢?這就需要藉助抽象與多態,即把可能變化的內容抽象出來,從而使抽象的部分是相對穩定的,而具體的實現層則是可以改變和擴展的。
開閉原則算是前5種原則的一個抽象總結,前5種是開閉原則的一些具體實現。