軟件開發六大設計原則 合稱SOLID
依賴倒置原則也是其中一個
依賴倒置原則定義:
- 上層模塊不應該依賴底層模塊,它們都應該依賴于抽象。
- 抽象不應該依賴于細節,細節應該依賴于抽象。
比較晦澀,如同軟件行業中的哲學
其中上層模塊與下層模塊
- 業務層 邏輯層 數據層
業務層中的軟件真正要進行的操作,就是做什么,或者叫面向用戶層
邏輯層是軟件現階段為了業務層的需求提供的實現細節,也就是怎么做
數據層指業務層和邏輯層所需要的數據模型
什么是抽象和細節?
抽象如其名字一樣,是一件很抽象的事物。抽象往往是相對于具體而言的,具體可以被稱為細節,當然也可以被稱為具象。
比如 抽象可以是畫,而國畫,油畫,素描就是具體
具體映射到軟件開發中,抽象可以是接口或者抽象類形式
public interface Driveable{
void drive();
}
class Bike implements Driveable{
@Override 注解 標識子類對父類方法的重載,在沒有abstract
public void drive() {
// TODO Auto-generated method stub
System.out.println("Bike drive.");
}
}
class Car implements Driveable{
@Override
public void drive() {
// TODO Auto-generated method stub
System.out.println("Car drive.");
}
}
Driveable就是抽象,然后 bike car 就是細節。
依賴倒置的好處
比如一個類person,在傳統編碼中是要什么給什么,引入什么對象
要出門,則三種交通工具都引入,作為成員變量。
這就是依賴于細節了,而且在交通方式變更中開銷會很大。
public class Person {
// private Bike mBike;
// private Car mCar;
// private Train mTrain;
private Driveable mDriveable;
public Person() {
//mBike = new Bike();
//mCar = new Car();
//mTrain = new Train();
mDriveable = new Train();
}
public void chumen() {
System.out.println("出門了");
//mBike.drive();
//mCar.drive();
//mTrain.drive();
mDriveable.drive();
}
}
所以 倒置過來 加入一層抽象
讓人依賴于抽象,改,只需要改抽象,引入只需要引入抽象 再實例化即可
抽象不應該依賴細節,細節應該依賴于抽象
什么是控制反轉
Inversion of Control
public class Person {
private Driveable mDriveable;
public Person(Driveable driveable) {
this.mDriveable = driveable;
}
public void chumen() {
System.out.println("出門了");
mDriveable.drive();
}
}
也就是說 不讓person創建對象 而是留一個接口,讓外側創建實例并傳遞進去
把內部依賴的創建權力移交給外部,只關注依賴提供的功能,但并不關心依賴的創建
IoC離不開IoC的容器,也就是實例化抽象的地方
public class Restaurant {
public static void peican(int orderid,int flowid) {
WaimaiYuan person;
Food food;
if ( orderid == 0) {
food = new PijiuYa();
} else {
food = new DuojiaoYutou();
}
if ( flowid % 2 == 0 ) {
person = new Xiaohuozi(food);
} else {
person = new XiaoGuniang(food);
}
person.songWaiMai();
}
}
比如例子中的Restaurant就是一個Ioc容器
配置 一詞比較重要
Spring相關度比較高
IoC模式最核心的地方就是在依賴方與被依賴方之間,引入了第三方,這個第三方統稱為IoC容器,因為IoC容器的介入,導致上層模塊對于它的依賴的實例化控制權發生變化,也就是所謂的控制反轉的意思。
依賴注入 Dependency Injection
其實也是講我們移交出對于依賴實例化的控制權,和IoC類似,并留有接口,在需要該依賴的時候注入進去injection
- 實現依賴注入有三種方式:
1.構造函數中注入
2.setter方式注入
3.接口注入
接口的存在,表明了一種依賴配置的能力
在軟件框架中,讀取xml配置文件,或者利用反射技術讀取注解,然后根據配置信息,框架動態將一些依賴配置給特定的接口類,我們也可以說injector也依賴于接口,而不是特定的實現類,這樣進一步提高了準確性與靈活性
總結
- 依賴倒置是面向對象開發領域中的軟件設計原則,它倡導上層模塊不依賴于底層模塊,抽象不依賴細節。
- 依賴反轉是遵守依賴倒置這個原則而提出來的一種設計模式,它引入了 IoC 容器的概念。
- 依賴注入是為了實現依賴反轉的一種手段之一。
- 它們的本質是為了代碼更加的“高內聚,低耦合”。