本文
依賴反轉原則 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($"特斯拉電瓶價:{原廠服務.維修電瓶服務(特斯拉.更換電瓶())}");
}
}