目錄
查看其它設(shè)計(jì)模式筆記坝锰,點(diǎn)這里→設(shè)計(jì)模式筆記匯總
依賴(lài)倒置原則(Dependence Inversion Principle, DIP)
- 定義:High level modules should not depend upon low level modules.Both should depend upon abstractions.Abstractions should not depend upon details.Details should depend upon abstractions.
- 高層模塊不應(yīng)該依賴(lài)低層模塊,兩者都因該依賴(lài)抽象
- 抽象不應(yīng)該依賴(lài)細(xì)節(jié)
- 細(xì)節(jié)應(yīng)該依賴(lài)抽象
- 核心:
- 面向接口編程
- 實(shí)踐方針:
- 變量不要持有具體類(lèi)的引用(用工廠替代new)
- 類(lèi)不要派生自具體類(lèi)(應(yīng)派生自抽象——接口或抽象類(lèi))
- 不要覆蓋基類(lèi)中已實(shí)現(xiàn)的方法(破壞基類(lèi)的抽象性,基類(lèi)中已實(shí)現(xiàn)的方法,應(yīng)由所有子類(lèi)共享)
- 我們不可能完全遵守上邊這些方針,但其實(shí)這只是一種思維方式的形成與鍛煉,讓我們?cè)谠O(shè)計(jì)時(shí)進(jìn)行充分考慮。一個(gè)不怎么會(huì)改變的類(lèi)鉴扫,那么直接在代碼中實(shí)例化是沒(méi)有問(wèn)題的。比如我們用了無(wú)數(shù)次的String澈缺。
- 作用:
- 減少類(lèi)之間的耦合坪创,提高系統(tǒng)穩(wěn)定性,降低并行開(kāi)發(fā)引起的風(fēng)險(xiǎn)谍椅,提高代碼的可讀性和可維護(hù)性误堡。
- 示例:
- 張三是你的司機(jī),負(fù)責(zé)開(kāi)你的寶馬雏吭。(這時(shí)候就有了Driver對(duì)象锁施,內(nèi)部有一個(gè)駕駛BMW對(duì)象的方法)。
- 但有一天你又買(mǎi)了輛奔馳杖们,這下完蛋了悉抵,張三沒(méi)有開(kāi)奔馳的方法。
- 顯然你不能再招一個(gè)專(zhuān)門(mén)開(kāi)奔馳的司機(jī)摘完,或者說(shuō)去修改張三的基因姥饰,讓他會(huì)開(kāi)奔馳。
- 正確的做法是抽象出汽車(chē)對(duì)象孝治,讓寶馬和奔馳實(shí)現(xiàn)汽車(chē)抽象列粪。然后讓Driver依賴(lài)汽車(chē)抽象。
- 這樣只要在出差前谈飒,注入相應(yīng)的汽車(chē)岂座,張三就可以開(kāi)動(dòng)了。即使以后你買(mǎi)了蘭博基尼也不用去動(dòng)張三杭措。
- 注入依賴(lài)的三種方法:(Car是汽車(chē)的抽象)
- 構(gòu)造函數(shù)注入
public class Driver { private Car car; public Driver(Car car){ this.car = car; } public void drive() { this.car.run(); } }
- Setter方法注入
public class Driver { private Car car; public void setCar(Car car) { this.car = car; } public void drive() { this.car.run(); } }
- 接口聲明注入
public class Driver { public void drive(Car car) { car.run(); } }
- 參考資料: