設計模式六大原則:依賴倒置原則

目錄: html

  設計模式六大原則:單一職責原則linux

  設計模式六大原則:接口隔離原則 編程

  設計模式六大原則:依賴倒置原則設計模式

  設計模式六大原則:里氏替換原則架構

  設計模式六大原則:迪米特法則ide

  設計模式六大原則:開閉原則函數

依賴倒置原則(Dependence Inversion Principle):  學習

  一、高層模塊不該該依賴底層模塊,兩者都應該依賴抽象。this

  二、抽象不該該依賴細節,細節應該依賴抽象。spa

  三、依賴倒置的中心思想是面向接口編程。

  四、依賴倒置原則是基於這樣的設計理念:相對於細節的多變性,抽象的東西要穩定的多。以抽象爲基礎搭建的架構比以細節爲基礎搭建的架構要穩定的多。

  五、使用接口或抽象類的目的是指定好規範,而不涉及任何具體的操做,把展示細節的任務交給他們的實現類來完成。

經典案例:

  三二班有個小明,想要學習C#,因而買了本《深刻理解C#》進行學習。 

 1 internal class Program
 2 {
 3     private static void Main(string[] args)
 4     {
 5         XiaoMing xm = new XiaoMing();
 6         xm.Study(new CSharp());
 7     }
 8 }
 9 
10 internal class CSharp
11 {
12     public void ShowMsg()
13     {
14         Console.WriteLine("《深刻理解C#》");
15     }
16 }
17 
18 internal class XiaoMing
19 {
20     public void Study(CSharp cSharp)
21     {
22         cSharp.ShowMsg();
23     }
24 }
view code

  過了一段時間,小明以爲光學習一門太沒有意思了。據說Linux比較好玩,因而買了本《鳥哥的私房菜Linux》。

 1 internal class Program
 2 {
 3     private static void Main(string[] args)
 4     {
 5         XiaoMing xm = new XiaoMing();
 6         xm.Study(new CSharp());
 7         xm.Study(new Linux());
 8     }
 9 }
10 
11 internal class CSharp
12 {
13     public void ShowMsg()
14     {
15         Console.WriteLine("《深刻理解C#》");
16     }
17 }
18 
19 internal class Linux
20 {
21     public void ShowMsg()
22     {
23         Console.WriteLine("《鳥哥的私房菜Linux》");
24     }
25 }
26 
27 internal class XiaoMing
28 {
29     public void Study(CSharp cSharp)
30     {
31         cSharp.ShowMsg();
32     }
33 
34     public void Study(Linux linux)
35     {
36         linux.ShowMsg();
37     }
38 }
view code

  小明是一個聰明的娃,過了一段時間學得差很少了,因而又想學習《設計模式》...就這樣小明在不斷學習中成長,而咱們的代碼卻愈來愈臃腫,變得難以維護。因爲XiaoMing是一個高級模塊而且是一個細節實現類,此類依賴了書籍CSharp和Linux又是一個細節依賴類,這致使XiaoMing每讀一本書都須要修改代碼,這與咱們的依賴倒置原則是相悖的。那如何解決XiaoMing的這種問題呢? 

 1 internal class Program
 2 {
 3     private static void Main(string[] args)
 4     {
 5         XiaoMing xm = new XiaoMing();
 6         xm.Study(new CSharp());
 7         xm.Study(new Linux());
 8     }
 9 }
10 
11 internal interface IBook
12 {
13     void ShowMsg();
14 }
15 
16 internal class CSharp : IBook
17 {
18     public void ShowMsg()
19     {
20         Console.WriteLine("《深刻理解C#》");
21     }
22 }
23 
24 internal class Linux : IBook
25 {
26     public void ShowMsg()
27     {
28         Console.WriteLine("《鳥哥的私房菜Linux》");
29     }
30 }
31 
32 internal class XiaoMing
33 {
34     public void Study(IBook book)
35     {
36         book.ShowMsg();
37     }
38 }
view code

  咱們發現,只要讓XiaoMing依賴於抽象IBook,其餘書籍依賴於該抽象,之後無論小明讀什麼書,哈哈都是so easy的。

依賴關係傳遞的三種方式:

  一、經過接口傳遞(上述示例) 

1 internal class XiaoMing
2 {
3     // 2.經過接口傳遞依賴對象
4     public void Study(IBook book)
5     {
6         book.ShowMsg();
7     }
8 }
view code

  二、經過構造方法傳遞  

 1 internal class XiaoMing
 2 {
 3     private IBook _book;
 4 
 5     // 1.經過構造函數傳遞依賴對象
 6     public XiaoMing(IBook book)
 7     {
 8         this._book = book;
 9     }
10 
11     public void Study()
12     {
13         this._book.ShowMsg();
14     }
15 }
view code

  三、經過Setter方法傳遞  

 1 internal class XiaoMing
 2 {
 3     private IBook _book;
 4 
 5     // 3.經過Setter方法傳遞依賴對象
 6     public void setBook(IBook _book)
 7     {
 8         this._book = _book;
 9     }
10 
11     public void Study()
12     {
13         this._book.ShowMsg();
14     }
15 }
view code

依賴倒置原則的本質就是經過抽象(接口或抽象類)使各個類或模塊的實現彼此獨立,不互相影響,實現模塊間的鬆耦合。咱們在項目中使用這個原則要遵循下面的規則:

  一、每一個類儘可能都有接口或者抽象類,或者抽象類和接口兩都具有

  二、變量的表面類型儘可能是接口或者抽象類

  三、任何類都不該該從具體類派生

  四、儘可能不要覆寫基類的方法

  五、若是基類是一個抽象類,而這個方法已經實現了,子類儘可能不要覆寫。類間依賴的是抽象,覆寫了抽象方法,對依賴的穩定性會有必定的影響

  六、結合里氏替換原則使用

相關文章
相關標籤/搜索