前言
面向對象有人分為五大原則,分別為單一職責原則、開放封閉原則、依賴倒置原則、接口隔離原則、里氏替換原則。
也有人分為六大原則,分別為單一職責原則、開放封閉原則、依賴倒置原則、接口隔離原則、里氏替換原則、迪米特法則。
現在我們來介紹依賴倒置原則
依賴倒置原則
1)概念
a.高層模塊不應該依賴於底層模塊,兩者應該依賴於其抽象。
b.抽象不應該依賴具體實現,具體實現應該依賴抽象。
上面2點是依賴倒置原則的概念,也是核心。主要是說模塊之間不要依賴具體實現,依賴接口或抽象。
其實依賴倒置原則的核心思想是面向接口編程。
2)例子
依賴倒置原則其實也沒什么可以說的,下面我們來舉個例子吧。
比如,學生看語文書。我們就實現這兩個類,一個是學生,一個是語文書。學生依賴於語文書,所以語文書是學生的一個屬性。
UML圖如下:
類如下。
首先是學生Student類:
public class Student { public void DoSomething(YuWenBook book) { book.LookYuWenBook(); } }
然后是語文書類YuWenBook類:
public class YuWenBook { public void LookYuWenBook() { Console.WriteLine("看語文書"); } }
最后,我們開始調用:
class Program { static void Main(string[] args) { YuWenBook book = new YuWenBook(); Student student = new Student(); student.DoSomething(book); } }
以上程序都沒有錯,new一個語文的對象,然后new一個學生對象,最后把語文對象賦值到學生的book中。完成了學生看書。
但是,這是不好擴展的,拋離了面向對象的低耦合,高內聚的思想。因為,如果,我們要添加學生看英語書,那怎么添加呢?
首先,在Student類中添加方法DoSomething(EnglishBook book); 然后再實現EnghlishBook類的LookEnglishBook方法。
最后調用,變成:
static void Main(string[] args) { YuWenBook book = new YuWenBook(); Student student = new Student(); student.DoSomething(book); //學生看英語書 EnglishBook englishBook = new EnglishBook(); student.DoSomething(englishBook); }
一看,就知道不好擴展。因為已經修改了Student類中代碼(增加了方法)。怎么才算好擴展呢,那么要聊起與開閉原則有關系了。對修改關閉,對擴展開放。所以我們盡量的不要修改Student類中的代碼。所以,我們增加一個接口,叫IBook:
public interface IBook { void LookBook(); }
然后,英語、語文各自繼承IBook:
public class EnglishBook: IBook { public void LookBook() { Console.WriteLine("看英語書"); } } public class YuWenBook:IBook { public void LookBook() { Console.WriteLine("看語文書"); } }
再修改一下Student的方法,接收IBook參數,變成:
public class Student { public void DoSomething(IBook book) { book.LookBook(); } }
最后,看我們是怎么調用的:
static void Main(string[] args) { IBook book = new YuWenBook(); Student student = new Student(); student.DoSomething(book); //學生看英語書 book = new EnglishBook(); student.DoSomething(book); }
看看,是不是可以很方面的擴展? 為什么這樣說呢?
因為當我們再添加一個學生看數學書的時候,我們只需要添加一個數學書類來繼承IBook,然后實現LookBook方法。最后我們用IBook對象來調用數學書類就可以了。可以看出,Student不用做任何修改,IBook也是。只需做相應的實現與調用即可。
3)小結
到此,介紹與例子到此結束了,我們可以看到面向對象的設計是多么的廣、深。從一些小小的例子、甚至身邊發生的事,都可以聯想到面向對象的設計。要掌握面向對象,首先要掌握其原則。
其他鏈接:
此文轉發,請注明出處,謝謝。
可以關注本人的公眾號,多年經驗的原創文章共享給大家。