C# 設計原則-依賴倒置原則
依賴倒置原則,全稱Dependence Inversion Principle,英文縮寫DIP。
主程式要依賴於抽象介面,不要依賴於具體實現。高層模組不應該依賴底層模組,兩者都應該依賴抽象。抽象不應該依賴細節,細節應該依賴抽象。
簡單地理解一下這話的意思。
依賴說的就是耦合性,如果A類依賴於B類,當B類修改或者刪除了,會對A類造成很大影響,那麼就可以說A類是完全為B類服務的。所以說,高層模組不應該依賴底層模組,這樣耦合性太強,不利於以後的升級或拓展。
兩者應該依賴於抽象。指的是它們共同有一個抽象或介面為父類,因為具體細節還沒實現,所以具有拓展性。
抽象不應該依賴細節。抽象僅僅是作為定義規範,細節只需要根據規範去實現,抽象不在乎具體如何去實現。
細節應該依賴抽象。細節的實現必須嚴格按照指定的規範去實現介面或抽象類的方法。
下面就舉個例子,一個人看書。
public class People { public void ReadStoryBook() { Console.WriteLine("read storyBook"); } }public static void Main(string[] args) { People people = new People(); people.ReadStoryBook(); }
這個People類就實現了readStoryBook的方法,但如果這個人想看其它書,那就只能繼續在這個People類上新增新的方法。如果想看的書多了,那麼需要新增的方法便會越來越多,同時,每次都得修改一個在執行得正常的類,容易出現問題。這就需要重新做設計。
根據依賴倒置原則的高層模組不應該依賴底層模組,這裡就把人和書緊緊關聯在一起,耦合性太強,高層模組方法的呼叫過度依賴於下層模組,不利於拓展。
那應該如何解決?兩者都應該依賴於抽象,書可以抽象出來,單獨定義一個Read方法。
public interface IBook { void Read(); }
把讀書方法單獨抽象出來,讓它不依賴於People類。
public class StoryBook : IBook { public void Read() { Console.WriteLine("read storyBook"); } }public class MathBook : IBook { public void Read() { Console.WriteLine("read mathBook"); } }
將People類改一下。
public class People { public void ReadBook(IBook book) { book.Read(); } } public static void Main(string[] args) { People people = new People(); people.ReadBook(new StoryBook()); people.ReadBook(new MathBook()); }
這樣,看書的方法就直接依賴於IBook介面上,拓展也變得方法,不需要去修改底層People類,每次想看不同的書,只需要new一本書就好。因為抽象不應該依賴於細節,對應IBook中的Read方法,並不關心看什麼書,怎麼看書,就只有看書這個動作,不關心細節。