依賴倒置原則 個人理解


依賴倒置原則核心:

上層模塊不應該依賴底層模塊,它們都應該依賴於抽象。

抽象不應該依賴於細節,細節應該依賴於抽象。

 

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類都沒有影響,這樣我們程序在開發過程中才可以健壯.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM