1. 程式人生 > >面向物件設計原則--里氏替換原則(LSP)和依賴倒置原則(DIP)

面向物件設計原則--里氏替換原則(LSP)和依賴倒置原則(DIP)

面向物件設計原則–里氏替換原則(LSP)和依賴倒置原則(DIP)

tags:設計模式

LSP–inheritance should ensure that any property proved about supertype objects also hold for subtype objects.

DIP–the principle states:
A. High-lever modules should not depend on low-level modules.both should depend on abstractions.
B.Abstractions should not depend upon details.Details should depend upon abstractions.

原則簡介

里氏替換原則和依賴倒置原則普遍用於各類設計模式,介面代表抽象的內容,子類相對具體,而且子類更傾向於發生”變化”.設計模式是兩個原則的忠實踐行者,如果說所有的設計模式有什麼共同特性的話,那麼就都在貫徹這兩個原則,務求使客戶程式”依賴於抽象而非具體”.

里氏替換原則

定義

所有引用基類的地方必須能夠透明的使用其子類物件.

解釋

通俗來講:子類可以擴充套件父類的功能呢個,但不能改變父類原有的功能呢個,是OCP的擴充套件.它包含以下四層含義:
1. 子類可以實現父類的抽象,但是不能覆蓋父類的非抽象方法.
2. 子類中可以增加自己特有的方法.
3. 當子類的方法過載父類的方法時,方法的前置條件要比父類方法的輸入更寬鬆.
4. 當子類的方法實現父類的抽象方法時,方法的後置條件要比父類的更嚴格.

依賴倒置原則

定義

高層模組不應該依賴底層模組,二者都應該依賴抽象;抽象不應該依賴細節;細節應該依賴抽象應該依賴抽象.

核心思想

面向介面程式設計,含有下面三點:
1. 低層模組儘量都要有抽象類或介面,或者兩者都要有
2. 變數的生命型別儘量使用抽象類或者介面
3. 用繼承時遵守里氏替換原則

里氏替換原則和依賴倒置原則的區別

兩者定義不同,里氏替換原則是關於子類和父類的原則;依賴倒置原則是關於抽象與細節的原則.

兩者應用範圍不同,依賴倒置原則比里氏替換原則使用範圍更廣.

涉及物件關係不同,里氏替換原則中的子類具有自己的獨立性;依賴倒置原則中的細節依賴於抽象.

兩者所站的角度不同,其中里氏替換原則是站在模式物件一方,而依賴倒置原則是站在客戶程式一方.模式物件一方將”相對多變的”子類視同它的介面看待,而客戶程式一方依賴的內容不是”相對多變的”子類,而是”相對穩定的”介面.

class interface Vehicle{
    void run();
}
class Bicycle implement Vehicle{}
class Train implement Vehicle{}
class Client{
    void showAVehicle (Vehicle vehicle){}
} 

上面的例子不長,但是可以看到兩個原則協作的效果.對於客戶端程式而言,為了讓車輛跑兩步,它依賴的不是Bicycle或者Train,而是能跑的Vehicle;同時,無論是Bicycle還是Train,因為它們滿足了Vehicle介面能”跑”的要求,所以可以被替換為介面的Vehicle來操作.