一、定義
依賴倒置原則(Dependence Inversion Principle,DIP)是程序要依賴於抽象接口,不要依賴於具體實現。簡單的說就是要求對抽象進行編程,不要對實現進行編程,這樣就降低了客戶與實現模塊間的耦合。
下面通過對面向過程和麪向對象的編程思想差異來理解依賴倒轉原則:
1、面向過程:
面向過程的開發模式是上層調用下層,上層依賴於下層,當下層發生變動時上層也要跟着變動,這就會導致模塊的複用性降低而且大大提高了開發的成本。
就像一個不明智父母寵溺孩子一樣,什麼事情都想辦法滿足孩子的需要,當孩子要糖要玩具各種需求來的時候,父母只能做出妥協由着孩子的性子。這樣的父母都費神費力,對孩子的教育成本很高。
2、面向對象:
面向對象的開發很好的解決了這個問題,一般情況下抽象的變化概率很小,讓用戶程序依賴於抽象,實現的細節也依賴於抽象。即使實現細節不斷變動,只要抽象不變,客戶程序就不需要變化。這大大降低了客戶程序與實現細節的耦合度。
父母跟孩子約定好:在你做好功課的前提下,我一個學期給你買一次玩具,而且價格不超過100元。做到孩子聽從父母,而不是父母慣着孩子。
二、案例分析:
1、面向實現編程的方式實現:
public class ChineseBook
{
public void learningChinese()
{
//TODO 學習語文
}
}
public class Student
{
public void doSomething(ChineseBook book)
{
book.learningChinese();
}
}
class Learning
{
static void Main(string[] args)
{
ChineseBook book = new ChineseBook();
Student student = new Student();
student.doSomething(book);
}
}
上面的案例中,我們實現了一個學生學習語文的功能。如果,我們要添加一門英語課程的話,首先,要在Student類中新增一個 DoSomething(EnglishBook book) 的方法; 然後再實現EnghlishBook類的learningEnglish方法。 最後main中的調用變成這樣:
Student student = new Student();
EnglishBook englishBook = new EnglishBook();
student.doSomething(englishBook);
2、面向接口編程的方式實現:
public interface IBook
{
void lookBook();
}
public class EnglishBook implement IBook
{
public void lookBook()
{
// TODO 學習英語
}
}
public class ChineseBook implement IBook
{
public void lookBook()
{
// TODO 學習語文
}
}
public class Student
{
public void doSomething(IBook book)
{
book.lookBook();
}
}
最後的調用方式:
static void Main(string[] args)
{
IBook chineseBook = new ChineseBook();
Student student = new Student();
student.doSomething(chineseBook);
//學生看英語書
IBook englishBook = new EnglishBook();
student.doSomething(englishBook);
}
如果我們需要添加新的科目,需要新創建一個類實現 IBook 即可,Studen 類是不需要做變動的,這種面向接口的編程方式符合對擴展開放、對修改關閉的原則。
END.