設計模式 面向物件設計七大原則
單一職責原則: 類的職責要單一,不要將太多的職責放在一個類中
開閉原則: 軟體實體對擴充套件是開放的,但對於修改是關閉的,即在不修改一個軟體實體的基礎上去擴充套件其功能
里氏代換原則: 在軟體系統中,一個可以接受基類物件的地方必然可以接受一個子類物件
依賴倒轉原則: 要對抽象層程式設計,不要針對具體類程式設計
介面隔離原則: 要使用多個專門的介面,不要使用同意的介面
合成複用原則: 在系統中要儘量使用組合和聚合關聯模式,少使用甚至不使用繼承關係
迪米特法則: 一個軟體實體對其他實體的引用越少越好
1.單一職責原則
定義:
一個物件應只包含單一職責,並且職責被完整的封裝在一個類中.
分析:
類的職責有兩個方面:資料職責,行為職責,資料職責由屬性體現,行為職責有方法體現.一個職責可能影響其他職責,因此要將職責分離,封裝到不同類中.
單一職責原則是實現"高內聚,低耦合"的指導方針.
2.開閉原則
定義:
一個軟體實體應當對擴充套件開放,對修改關閉.
分析:
開閉原則是面向物件可複用性設計的一塊基石,抽象化設計是開閉原則的關鍵.
開閉原則注重的是無需對抽象層進行改動,只需要增加新的具體類來實現新的業務.
開閉原則可以通過"對可變性封裝原則"來描述,即找到系統的可變因素將其封裝起來.
百分百的開閉原則是很難做到的
3.里氏代換原則
定義:
所有引用基類的地方,必須能透明的使用其子類的物件.
分析:
里氏代換原則是實現開閉原則的重要方式
軟體中能使用基類物件的地方一定能使用其子類物件,反之不成立.
要儘量使用基類型別對物件定義,執行時在確定其子類型別,用子類替換父類.
子類的所有方法必須在父類中宣告,子類必須實現父類中宣告的所有方法
儘量把父類設計為抽象類或介面,讓子類繼承或實現父類.
4.依賴倒轉原則
定義:
高層模組不應該依賴於底層模組,他們都應該依賴於抽象,抽象不應該依賴於細節,細節應該依賴於抽象
即要針對介面程式設計,不要針對實現程式設計
分析:
程式碼要依賴於抽象類,不要依賴於具體類,要針對介面或抽象類程式設計,而不是針對具體類程式設計.
開閉原則是面向物件設計的目標,依賴倒轉原則是面向物件設計的主要手段
依賴倒轉原則是Spring等技術和框架後的基本原則之一
類之間的耦合:
(1)零耦合:兩個類沒有任何耦合關係
(2)具體耦合:發生在兩個具體類中,有一個具體類對另一個具體類的例項的直接引用產生.
(3)抽象耦合:發生在一個具體類和一個抽象類(也可以兩個抽象類)中,由於抽象耦合中至少有一個是抽象的所以可以通過不同的實現進行擴充套件.
依賴倒轉原則就是要求客戶端依賴於抽象耦合,這是依賴倒轉原則的關鍵.
5.介面隔離原則
定義:
客戶端不能依賴那些它不需要的介面
分析:
要使用多個專門的介面,而不要使用單一的總介面
拆分介面時,要符合單一職責原則,介面中的方法越少越好
6.合成複用原則
定義:
要儘量使用物件組合,而不是繼承來達到複用的目的
分析:
通過繼承來實現複用很簡單,而且子類可以覆蓋父類方法,易於擴充套件.但是繼承複用會破壞系統的封裝性,會將實現的細節暴露給子類.
通過組合/聚合來複用,是將一個類的物件作為另一個類的物件的一部分,成員物件的內部細節對於新物件是不可見的,耦合度相對較低.
從基類繼承來的實現時靜態的,而合成服用可以在執行時動態的進行,新物件可以動態的引用與成員物件型別相同的其他物件.
7.迪米特法則
定義:
一個軟體實體應當儘可能少的與其他實體發生相互作用
分析:
如何兩個類之間不必彼此直接通訊,那麼這裡兩個類就不應當發生直接相互作用,可以通過第三者轉發這個呼叫.
簡單來說,不要和"陌生人"說話,要和你的直接"朋友"通訊