面向對象原則之一 依賴倒置原則
前言
面向對象有人分為五大原則,分別為單一職責原則、開放封閉原則、依賴倒置原則、接口隔離原則、裏氏替換原則。
也有人分為六大原則,分別為單一職責原則、開放封閉原則、依賴倒置原則、接口隔離原則、裏氏替換原則、迪米特法則。
現在我們來介紹依賴倒置原則
依賴倒置原則
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)小結
到此,介紹與例子到此結束了,我們可以看到面向對象的設計是多麽的廣、深。從一些小小的例子、甚至身邊發生的事,都可以聯想到面向對象的設計。要掌握面向對象,首先要掌握其原則。
其他鏈接:
開放封閉原則(開閉原則)
單一職責原則
依賴倒置原則
接口隔離原則
裏氏替換原則
迪米特法則
此文轉發,請註明出處,謝謝。
可以關註本人的公眾號,多年經驗的原創文章共享給大家。
面向對象原則之一 依賴倒置原則