設計模式七大原則之依賴倒轉原則

依賴倒轉原則:抽象不應該依賴於細節,細節應當依賴於抽象,換言之,要針對接口編程,而不是針對實現編程。

        依賴倒轉原形要求程序代碼中傳遞參數時或在關聯關係中,進來引用層次高的抽象層類,即使用接口和抽象類進行變量類型聲明、參數類型聲明、方法返回類型聲明,以及數據類型的轉換等,而不要用具體類來做這些事情。爲了確保該原則的應用,一個具體類應當只實現接口或抽象中聲明過的方法,而不要給出多餘的方法,否則將無法調用到在子類中增加的新方法。

        在引入抽象層後,系統將具有很好的靈活性,在程序中儘量使用抽象層來進行編程,而將具體類寫在配置文件中,這樣一來,如果系統行爲發生變化,只需要對抽象層進行擴展,並修改配置文件,而無須修改原有系統的源代碼,就能擴展系統的功能,滿足開閉原則的要求。

       在實現一來倒轉原則時,需要針對抽象層編程,而將具體類的對象通過依賴注入的方式注入到其他對象中。依賴注入是指當一個對象要與其他對象發生依賴關係時,通過抽象來注入所依賴的對象。常用的注入方式有3種:構造注入,設置注入和接口注入。構造注入是指通過構造函數來傳入具體類的對象,設值注入是指通過set方法來傳入具體類的對象,而接口注入是指實現該接口中聲明的業務方法來傳入具體類的對象。這些方法在定義時使用的是抽象類型,在運行時再傳入具體類型的對象。這些方法在定義時使用的是抽象類型,在運行時再傳入具體類型的對象,由子類對象來覆蓋父類對象。

代碼示例:

 1   //具體Jim人類
 2     public class Jim
 3     {
 4         public void eat(Apple apple)
 5         {
 6             Console.WriteLine("Jim eat " + apple.getName());
 7         }
 8     }
 9     //具體蘋果類
10     public class Apple
11     {
12         public String getName()
13         {
14             return "apple";
15         }
16     }
17     public class Client
18     {
19         public static void main(String[] args)
20         {
21             Jim jim = new Jim();
22             Apple apple = new Apple();
23             jim.eat(apple);
24         }
25     }

 

        上面的例子比較簡單,Jim吃蘋果,看起來沒什麼問題,但此刻需要改變,小李吃蘋果,小王吃香蕉呢?這個時候我們需要根據依賴倒轉重新設計一下。

 1    //人接口
 2     public interface People
 3     {
 4         public void eat(Fruit fruit);//人都有吃的方法,不然都餓死了
 5     }
 6     //水果接口
 7     public interface Fruit
 8     {
 9         public String getName();//水果都是有名字的
10     }
11     //具體Jim人類
12     public class Jim : People
13     {
14         public void eat(Fruit fruit)
15         {
16             Console.WriteLine("Jim eat " + fruit.getName());
17         }
18     }
19     //具體蘋果類
20     public class Apple : Fruit
21     {
22         public String getName()
23         {
24             return "apple";
25         }
26     }
27     //具體香蕉類
28     public class Banana : Fruit
29     {
30         public String getName()
31         {
32             return "banana";
33         }
34     }
35 
36     class Program
37     {
38         static void Main(string[] args)
39         {
40             People jim = new Jim();
41             Fruit apple = new Apple();
42             Fruit Banana = new Banana();//這裏符合了里氏替換原則
43             jim.eat(apple);
44             jim.eat(Banana);
45 
46             Console.ReadLine();
47         }
48     }

    這個時候定義了把高層接口抽象化了,只需要對新增的實現類進行修改就可以了。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章