面向物件設計原則--里氏替換原則(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來操作.