依賴倒置原則核心:
上層模塊不應該依賴底層模塊,它們都應該依賴於抽象。
抽象不應該依賴於細節,細節應該依賴於抽象。
OR
高層模塊不應該依賴低層模塊,二者都應該依賴其抽象;抽象不應該依賴細節;細節應該依賴抽象。
上層模塊是我們要做什么,下層模塊是怎么做
例如:Eat里面我們要吃什么就是所謂的上層 而面包類,包子類 就是下層模塊,
例如我要實現一個吃面包過程
里面包含三個部分,一個是吃的什么,一個是開始吃的命令,還有一個是輸出吃.
public class Bread { public void Being_eaten() { Console.WriteLine("我是面包我被吃了"); } } public class Eat { public void eat(Bread bread) { bread.Being_eaten(); } } static void Main(string[] args) { //實例化面包 Bread bread = new Bread(); //實例化吃的方法 Eat eat = new Eat(); //開始吃 eat.eat(bread); Console.ReadLine(); }
ok上面是一個很完整的吃面包過程,那么這個時候,我不僅僅是想吃面包了,我還想吃包子怎么辦?
public class Bread { public void Being_eaten() { Console.WriteLine("我是面包我被吃了"); } } public class Bun { public void Being_eaten() { Console.WriteLine("我是包子!!我被吃了"); } } public enum Food { Bread, Bun } public class Eat { public void eat(Food _food) { if (_food == (Food)0) { Bread bread = new Bread(); bread.Being_eaten(); } else if (_food==(Food)1) { Bun bun = new Bun(); bun.Being_eaten(); } } } static void Main(string[] args) { //實例化面包 // Bread bread = new Bread(); //實例化吃的方法 Eat eat = new Eat(); //開始吃 eat.eat((Food)1); Console.ReadLine(); }
看着用很輕松的解決了吃包子跟面包的問題,但是我們明顯發現了Eat這個類因為要吃的東西變多所以做了很明顯的改變,那我們現在吃包子跟面包,那如果我要吃滿漢全席,是不是得寫108個 else if??
所以我們需要依賴倒置的寫法,這種方法不會破壞Eat這個動作.
你要怎么辦?
public interface IFood { void Being_eaten(); } public class Bread: IFood { public void Being_eaten() { Console.WriteLine("我是面包我被吃了"); } } public class Bun: IFood { public void Being_eaten() { Console.WriteLine("我是包子!!我被吃了"); } } public class Eat { public void eat(IFood Food) { Food.Being_eaten(); } } static void Main(string[] args) { //實例化面包 Bread bread = new Bread(); //實例化吃包子方法 Bun bun = new Bun(); //實例化吃的方法 Eat eat = new Eat(); //開始吃 eat.eat(bread); Console.ReadLine(); }
通過上面的代碼我們發現,吃什么已經不在是Eat這個類所需要考慮的事情了,外部無論有多少類要吃東西,對我們的Eat類都沒有影響,這樣我們程序在開發過程中才可以健壯.