本文

依賴反轉原則 Dependency Inversion Principle(DIP)

定義:

  • 1、高階模組不應該依賴於低階模組,兩者都該依賴抽象。

  • 2、抽象不應該依賴於具體實作方式,具體實作方式應該依賴抽象。

    目標:解除物件與物間之間直接依賴的關係。

舉例:傳統汽車在車子故障、或是想要更換零件時,需要選擇維修廠進行這個動作。

	public class 汽車狀況
        {
            public bool 更換電瓶()
            {
                return true;
            }
        }

        public class A汽車保養廠
        {
            public int 電瓶價格()
            {
                return 50000;
            }
        }
		
	private static void Main(string[] args)
        {
            var 汽車 = new 汽車狀況();
            //需要更換電瓶了
            if (汽車.更換電瓶() == true) 
            {
                var 汽車保養廠 = new A汽車保養廠();
                Console.WriteLine($"電瓶價格:{汽車保養廠.電瓶價格()}");
            }
        }

車主一看價格驚覺事情不太對勁,決定要更換一間汽車保養廠,此時程式就必須要跟著改變內容。

	public class 汽車狀況
        {
            public bool 更換電瓶()
            {
                return true;
            }
        }
		
	public class B汽車保養廠
        {
            public int 電瓶價格()
            {
                return 5000;
            }
        }
		
	private static void Main(string[] args)
        {
            var 汽車 = new 汽車狀況();
            //需要更換電瓶了
            if (汽車.更換電瓶() == true) 
            {
                var 汽車保養廠 = new B汽車保養廠();
                Console.WriteLine($"電瓶價格:{汽車保養廠.電瓶價格()}");
            }
        }

這時候雖然暫時解決的車主的問題,但其實還有很多衍生問題,例如:並不知道零件好壞、也不知道來源是從何而來、適不適合自己的汽車?
從程式的角度來看,汽車需要更換零件這件事高度依賴於汽車保養廠,所以我們也應該想想要如何解決這件事。

所以我們的特斯拉又登場了,特斯拉的零件全部都由原廠提供,一來能夠保證品質、二來如果東西有問題也不怕找不到人負責。

	public class 特斯拉狀況
        {
            public bool 更換電瓶()
            {
                return true;
            }
        }
		
	//建立一個I原廠服務的介面
	public interface I原廠服務
        { 
            public int 維修電瓶服務(bool 狀態) ;
        }

	//實作部分
        public class 原廠服務 : I原廠服務
        {
            public int 維修電瓶服務(bool 狀態)
            {
                if (狀態 == true)
                {
                    return 5000;
                }
                return 0;
            }
        }
		
	//這樣一來就能解決特斯拉與原廠服務的直接相依關係
	private static void Main(string[] args)
        {
            I原廠服務 原廠服務 = new 原廠服務();
            var 特斯拉 = new 特斯拉狀況();
            //需要更換電瓶了
            if (特斯拉.更換電瓶() == true)
            {
                Console.WriteLine($"特斯拉電瓶價:{原廠服務.維修電瓶服務(特斯拉.更換電瓶())}");
            }
        }

參考連結