本文

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

定義:

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

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

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

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

  1. public class 汽車狀況
  2. {
  3. public bool 更換電瓶()
  4. {
  5. return true;
  6. }
  7. }
  8. public class A汽車保養廠
  9. {
  10. public int 電瓶價格()
  11. {
  12. return 50000;
  13. }
  14. }
  15. private static void Main(string[] args)
  16. {
  17. var 汽車 = new 汽車狀況();
  18. //需要更換電瓶了
  19. if (汽車.更換電瓶() == true)
  20. {
  21. var 汽車保養廠 = new A汽車保養廠();
  22. Console.WriteLine($"電瓶價格:{汽車保養廠.電瓶價格()}");
  23. }
  24. }

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

  1. public class 汽車狀況
  2. {
  3. public bool 更換電瓶()
  4. {
  5. return true;
  6. }
  7. }
  8. public class B汽車保養廠
  9. {
  10. public int 電瓶價格()
  11. {
  12. return 5000;
  13. }
  14. }
  15. private static void Main(string[] args)
  16. {
  17. var 汽車 = new 汽車狀況();
  18. //需要更換電瓶了
  19. if (汽車.更換電瓶() == true)
  20. {
  21. var 汽車保養廠 = new B汽車保養廠();
  22. Console.WriteLine($"電瓶價格:{汽車保養廠.電瓶價格()}");
  23. }
  24. }

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

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

  1. public class 特斯拉狀況
  2. {
  3. public bool 更換電瓶()
  4. {
  5. return true;
  6. }
  7. }
  8. //建立一個I原廠服務的介面
  9. public interface I原廠服務
  10. {
  11. public int 維修電瓶服務(bool 狀態) ;
  12. }
  13. //實作部分
  14. public class 原廠服務 : I原廠服務
  15. {
  16. public int 維修電瓶服務(bool 狀態)
  17. {
  18. if (狀態 == true)
  19. {
  20. return 5000;
  21. }
  22. return 0;
  23. }
  24. }
  25. //這樣一來就能解決特斯拉與原廠服務的直接相依關係
  26. private static void Main(string[] args)
  27. {
  28. I原廠服務 原廠服務 = new 原廠服務();
  29. var 特斯拉 = new 特斯拉狀況();
  30. //需要更換電瓶了
  31. if (特斯拉.更換電瓶() == true)
  32. {
  33. Console.WriteLine($"特斯拉電瓶價:{原廠服務.維修電瓶服務(特斯拉.更換電瓶())}");
  34. }
  35. }

參考連結