依賴倒轉原則(Dependency Inversion Principle, DIP):抽象不應該依賴于細節(jié),細節(jié)應當依賴于抽象。換言之,要針對抽象(接口)編程,而不是針對實現(xiàn)細節(jié)編程。
開閉原則(OCP)是面向對象設計原則的基礎也是整個設計的一個終極目標,而依賴倒置原則(DIP )則是實現(xiàn)OCP原則的一個基礎,換句話說開閉原則(OCP)是你蓋一棟大樓的設計藍圖,那么依賴倒置原則就是蓋這棟大樓的一個鋼構框架,沒有鋼構架構是很難順利蓋起一棟大樓的,同樣的在面向對象軟件設計的過程中不遵守依賴倒置原則是很難開發(fā)出符合開閉原則的軟件的。更不用說開發(fā)出易于維護,易于升級的軟件。 因此開閉原則是非常重要的一個原則,它有很強的實操性,并且能夠直接指導我們寫代碼代碼。
通常要符合這個原則的第一步就是針對抽象編程,類之間的依賴關系盡量去使用高層抽象不要使用底層的實現(xiàn)細節(jié),從軟件工程來說高層抽象是較穩(wěn)定的,也就是說抽象具有一定的穩(wěn)定性,而實現(xiàn)細節(jié)較不穩(wěn)定,也就是說實現(xiàn)細節(jié)具有易變性,而我們期望軟件具有更好的穩(wěn)定性,顯而易見我們在開發(fā)的時候自然而然的要走穩(wěn)定路線(依賴抽象編程)。這個原則也是對軟件工程中要求“高聚低偶”實踐一個保障和指導。
我們來看一個例子假設我們在開發(fā)一個軟件產品需要一個日志系統(tǒng),要將系統(tǒng)產生的一些重要事情記錄在記事本上。通常我們的實現(xiàn)如下:
public class Logger { public void Info(string infoText) { Console.WriteLine($"[{DateTime.Now}][Info]:{infoText}"); } public void Debug(string debugText) { Console.WriteLine($"[{DateTime.Now}][Debug]:{debugText}"); } public void Warn(string warmText) { Console.WriteLine($"[{DateTime.Now}][Warm]:{warmText}"); } public void Error(string errorText,Exception exception) { Console.WriteLine($"[{DateTime.Now}][Error]:{errorText} - Exception:{exception.Message}");