## 英文名稱(Dependence Inversion Principle ,DIP)
**定義**:高層模塊不應該依賴低層模塊,應該依賴其抽象,抽象不應該依賴其細節,細節應該依賴其抽象。
**這句話在java中的理解**:
低層模塊:具體細化的java類
高層模塊:是由多個低層模塊組成的。
抽象:指的是接口或者抽象類
依賴:存在類A的一個方法S,S傳入的參數是另一個類B的實例,那么類A依賴于類B?我的理解---在項目開發中盡量將相同模塊細化,類與類之間減少依賴關系,應該依賴其抽象類或者接口。
一個反面的例子:
----一個司機開寶馬車。
按照常規的思維:定義一個司機類(Driver)有個void drive(BMW bmw)方法。該方法需要傳入寶馬車實例,
定義一個寶馬車類(BMW) 有一個run方法。

~~~
public class DIPTest {
public static void main(String[] args) {
new Driver().drive(new BMW());
}
}
class Driver{
public void drive(BMW bmw){
System.out.println("司機開車...");
bmw.run();
}
}
class BMW{
public void run(){
System.out.println("寶馬車開動了....");
}
}
~~~
**更改需求**,司機現在改開奔馳了,那么如果在這個類的基礎上更改,我們需要給司機提供一個drive(Benz b)的方法。
同時再提供一個Benz類,提供一個run方法。那么就存在類之間的依賴性太大,不利于類的拓展。
**----解決方案**:
讓細節類依賴其抽象,寶馬車、奔馳車都具有run()方法,司機都具有drive(Car car)的方法。可以將共同的方法和類抽象成接口。
這樣設計的好處,可以將司機和車分為兩個模塊進行開發,兩者之間的依賴關系存在于接口,而具體實現類依賴于接口。這樣在分工協作時,只需要各自定義好接口的操作方法就可以了。并且類的擴展性也大大提高。

~~~
package hpu.lzl.dip;
public class DIPTest2 {
public static void main(String[] args) {
IDriver d = new Driver2();
ICar ic = new BenzCar();
d.Driver(ic);
System.out.println("----------------");
d.Driver(new BMWCar());
}
}
interface IDriver{
public void Driver(ICar car);
}
interface ICar{
public void run();
}
class Driver2 implements IDriver{
@Override
public void Driver(ICar car) {
System.out.println("司機開車.....");
car.run();
}
}
class BMWCar implements ICar{
@Override
public void run() {
System.out.println("寶馬車開動了....");
}
}
class BenzCar implements ICar{
@Override
public void run() {
System.out.println("奔馳車開動了....");
}
}
~~~
依賴的三種寫法
## 1、構造函數傳遞依賴
~~~
interface IDriver{
public void drive();
}
class Driver2 implements IDriver{
private ICar car;
public Driver2(ICar car){
this.car = car;
}
@Override
public void drive() {
System.out.println("司機發動車了...");
car.run();
}
}
~~~
## 2、setter方法傳遞依賴
~~~
interface IDriver{
public void drive();
public void setCar(ICar car);
}
class Driver2 implements IDriver{
private ICar car;
@Override
public void drive() {
System.out.println("司機開車.....");
car.run();
}
@Override
public void setCar(ICar car) {
// TODO Auto-generated method stub
this.car = car;
}
}
~~~
## 3、接口傳遞依賴
~~~
interface IDriver{
public void drive(ICar car);
}
class Driver2 implements IDriver{
@Override
public void drive(ICar car) {
System.out.println("司機發動車了...");
car.run();
}
}
~~~
**我對依賴倒置的理解**
依賴倒置首先要求類之間具有聯系,將其聯系抽象成接口或者抽象類,這樣降低類之間的依賴。從而產生抽象類或接口之間的依賴,將具體事物時間的依賴轉化成抽象接口的依賴。
- 前言
- 6大設計原則(一)---單一職責原則
- 6大設計原則(二)---里氏替換原則
- 6大設計原則(三)---依賴倒置原則
- 6大設計模式(四)----接口隔離原則
- 6大設計原則(五)---迪米特法則
- 6大設計原則(六)---開閉原則。
- 設計模式(一)---單例模式
- 設計模式(二)---工廠方法模式
- 設計模式(三)---抽象工廠模式
- 設計模式(四)---模板方法模式
- 設計模式(五)---建造者模式
- 設計模式(六)---代理模式
- 設計模式(七)---原型模式
- 設計模式(八)---中介者模式
- 設計模式(九)---命令模式
- 設計模式(十)---責任鏈模式
- 設計模式(十一)---裝飾模式
- 設計模式(十二)---策略模式
- 設計模式(十三)---適配器模式
- 設計模式(十四)---迭代器模式
- 設計模式(十五)---組合模式
- 設計模式(十六)---觀察者模式
- 設計模式(十七)---門面模式
- 設計模式(十八)---備忘錄模式
- 設計模式(十八)---訪問者模式
- 設計模式(二十)---狀態模式
- 設計模式(二十二)---享元模式
- 設計模式(二十三)---橋梁模式