高層模組不應該依賴底層模組,兩者都應該依賴其抽象;
抽象不應該依賴細節;
細節應該依賴抽象。
public
inte***ce
idriver
public
class
driver
implements
idriver
}public
inte***ce
icar
public
class
benz
implements
icar
}public
class
bmwimplements
icar
}public
class
client
}依賴的三種寫法
建構函式傳遞依賴物件——建構函式注入
set方法傳遞依賴物件——set依賴注入
介面宣告依賴物件——介面注入
我們得替老王主持想個辦法對不對?
不如把這個掃地的差事交給老王的師弟老方吧,老方負責去叫小二和尚還是小三和尚還是小四和尚去執行老王主持的命令。**可以這樣實現。
定義乙個掃地和尚的介面,**如下所示:
public
inte***ce
heshang
小二類的**修改如下所示:
public
class
xiaoer
implements
heshang
public
boolean
isyijinjing()
}小三類的**修改如下所示:
public
class
xiaosan
implements
heshang
}老方類的**如下所示:
public
class
laofang
return xiaoer;}}
如果老方確認小二和尚在練易筋經,就叫小三和尚。
老王類的**修改如下所示:
public
class
laowang
}測試類的**不改變,如下所示:
public
class
test
}老王現在是不是省心多了,他只管下命令,該叫誰去掃達摩院的地由他師弟老方去負責。
我們替老王想的這個辦法就叫控制反轉(inversion of control,縮寫為 ioc),它不是一種技術,而是一種思想——指導我們設計出松耦合的程式。
控制反轉從詞義上可以拆分為「控制」和「反轉」,說到控制,就必須找出主語和賓語,誰控制了誰;說到反轉,就必須知道正轉是什麼。
你看,在緊耦合的情況下,老王下命令的時候自己要通過 new 關鍵字建立依賴的物件(小二和尚或者小三和尚);而控制反轉後,老王要找的掃地和尚由他師弟老方負責,也就是說控制權交給了老方,是不是反轉了呢?
ioc/di
設計模式 依賴倒置
依賴倒置原則 dependence inversion principle 定義 high level modules should not depend upon low level modules,both should depend upon abstractions.abstractions...
設計模式 依賴倒置原則
what high level modules should note depend upon low level modules.both should depend 高層模組不應該依賴底層模組,兩者都應該其抽象 抽象不應該依賴細節 細節應該依賴抽象 模組間的依賴通過抽象發生,實現類之間不發生直接...
設計模式 依賴倒置 DIP
高層次的模組不應該依賴 於 低層次的模組,兩者都應該依賴於 抽象介面。抽象的介面不應該依賴於具體的實現,而具體的實現依賴於抽象的介面 這個可能和我們常見的 熟能生巧 成為反比,平時我們設計了很多具體實現,才慢慢發現,其中的道,於是後來就抽象出來一種靈巧的方式,完成我們的工作 但是在快速,協作的開發環...