依賴反轉原則
提出問題
- 依賴反轉這個概念指的是"誰跟誰"的"什麼依賴"被反轉了?”反轉“兩個字該如何了解?
- "控制反轉"和"依賴注入"這兩個概念和依賴反轉有什麼差別和聯系?
- 如果你熟悉Java語言,那Spring架構中的IOC跟這些概念又有什麼關系呢?
控制反轉(IOC)
Inversion Of Control
如何了解
控制:指的是程式對執行流程的控制
反轉:指的是在沒有使用架構之前,程式員自己控制整個程式的執行。在使用架構之後,整個程式的執行流程可以通過架構來控制。流程的控制權從程式員"反轉"到了架構。
注:控制反轉并不是一種具體的實作技巧,而是一個比較籠統的設計思想,一般用來指導架構層面的設計。
應用示例
/**
* 測試用例基類
*/
public abstract class TestCase{
public void run(){
if(doTest()){
System.out.println("Test successed.");
}else{
System.out.println("Test failed.");
}
}
public abstract void doTest();
}
public class JunitApplication{
private static final List<TestCase> testCases=new ArrayList<>();
public static void register(TestCase testCase){
testCases.add(testCase);
}
public static void main(String[] args){
for(TestCase testCase:testCases){
case.run();
}
}
}
分析:以上代碼中測試用例的流程由 main方法中for循環執行,程式員隻需要實作基類TestCase中的doTest方法,而不需要關系執行流程。
## 依賴注入(DI)
Dependency Injection
不通過new()的方式在類内部建立依賴類對象,而是将依賴的對象在外部建立好之後,通過構造函數、函數參數等方式傳遞(或注入)給類使用。
注:依賴注入是一種具體的編碼技巧。
應用示例
/**
* 非依賴注入方式實作
*/
public class Notification{
private MessageSender messageSender;
public Notification(){
this.messanger=new MessageSender();//此處是new方式建立對象
}
}
/**
* 依賴注入方式實作
*/
public class Notification{
private MessageSender messageSender;
public Notification(){
}
//構造函數注入方式
public Notification(MessageSender messageSender){
this.messageSender=messageSender;
}
}
依賴注入架構(DI Framework)
産生原因
由于項目中可能會涉及很多類,類和對象的建立和依賴注入會變得非常複雜。如果這部分工作全靠程式員自己寫代碼完成,容易出錯且開發成本也比較高。而對象建立和依賴注入的工作,本身跟具體的業務無關,完全可以抽象成架構來自動完成。
架構作用
通過依賴注入架構可以通過簡單的配置一下類和類之間的依賴關系,就可以由架構自動建立對象、管理對象的聲明周期、依賴注入等原本需要程式員來做的事情。
## 控制反轉原則
Dependency Inversion Principle (DIP) 依賴反轉原則
如何了解
High-level modules shouldn t depend on low-level modules. Both modules shoud depend on abstractions. In addition, abstractions shouldn
t depend on details. Details depend on abstractions.
高層子產品(high-level modules)不要依賴低層子產品(low-level)。高層子產品和低層子產品應該通過抽象來互相依賴。除此之外,抽象(abstractions) 不要依賴具體實作細節(details),具體實作細節(details)依賴抽象(abstractions)。
高層子產品:在調用鍊上,調用者屬于高層
底層子產品:在調用鍊上,被調用者屬于低層
注:本文是根據尚矽谷和極客學院的課程整理的學習筆記,如要深入了解,請收看老師的原版視訊。