例如:JDBC 咱們在java開發中訪問數據庫,代碼並不直接依賴數據庫驅動,而是依賴JDBC,當應用程序須要更換數據庫,不須要修改任何代碼。這正是由於應用代碼,高層模塊,不依賴數據庫驅動,而是依賴抽象JDBC,而數據庫驅動,做爲底層模塊,也依賴JDBC。java
平常開發中,service層依賴DAO層,並非直接依賴DAO的具體實現,而是依賴DAO提供的抽象接口,但這並非依賴倒置,依賴倒置中,除了具體實現要依賴抽象,最重要的是抽象是屬於誰的抽象。數據庫
按照依賴倒置原則,接口的全部權是被倒置的,也就是說,接口被高層模塊定義,高層模塊擁有接口,底層模塊實現接口。不是高層模塊依賴底層模塊的接口,而是底層模塊依賴高層模塊的接口,從而實現依賴關係的倒置。 在上面的依賴層次中,每一層的接口都被高層模塊定義,由底層模塊實現,高層模塊徹底不依賴底層模塊,及時是底層模塊的接口。這樣,底層模塊的改動不會影響高層模塊,高層模塊的複用也不會依賴底層模塊。對於Service和DAO這個例子來講,就是Service定義接口,DAO實現接口,這樣才符合依賴倒置原則。編程
因此依賴倒置原則也被稱爲好萊塢原則:Dont't call me, I will call you. 即不要來調用我,我會調用你。Tomcat、Spring 都是基於這個原則設計出來的,應用程序不須要調用Tomcat或者Spring這樣的框架,而是框架調用應用程序。而實現這一特性的前提就是應用程序必須實現框架的接口規範,好比實現Servlet接口。框架
依賴倒置原則通俗說就是,高層模塊不依賴底層模塊,而是都是依賴抽象接口,這個抽象接口一般是由高層模塊定義,底層模塊實現。函數
依賴倒置原則最典型的使用場景就是框架的設計。設計
框架提供框架核心功能,好比HTTP處理,MVC等,並提供一組接口規範,應用程序只須要遵循接口規範編程,就能夠被框架調用。程序使用框架的功能,可是不調用框架的代碼,而是實現框架的接口,被框架調用,從而框架有更高的可複用性,被應用於各類軟件開發中。繼承