依賴倒置原則的理解
阿新 • • 發佈:2020-12-12
一直不太理解這個原則,直到看到了這個例子:
class DriverTest {
@Test
fun main(){
val driver = Driver()
val benz = Benz()
driver.driver(benz)
}
}
class Driver{
fun driver(car: Benz){
car.run()
}
}
class Benz{
fun run(){
println( "賓士開始執行")
}
}
此時司機又要駕駛寶馬了,怎麼辦?
錯誤示範:
class DriverTest {
@Test
fun main(){
val driver = Driver()
val benz = Benz()
driver.driver(benz)
val bmw = BMW()
driver.driver(bmw)
}
}
class Driver{
fun driver(car: Benz){
car.run ()
}
fun driver(car: BMW){
car.run()
}
}
class Benz{
fun run(){
println("賓士開始執行")
}
}
class BMW{
fun run(){
println("寶馬開始執行")
}
}
需要修改原來核心的Driver類,新增方法,也不符合開閉原則(對拓展開放,對修改關閉)。
正確示範:
/**
* Created by Alex on 12/11/20
*/
class DriverTest {
@Test
fun main(){
val driver = Driver()
driver.driver(BenZ())
driver.driver(BMW())
}
}
class Driver{
fun driver(car: ICar){
car.run()
}
}
interface ICar{
fun run()
}
class BenZ: ICar{
override fun run() {
println("賓士開始運行了")
}
}
class BMW: ICar{
override fun run() {
println("寶馬開始運行了")
}
}
此時如果說還想開法拉利?
新建一個類繼承ICar,實現run方法,完事兒了,是不是面向介面程式設計,是不是依賴抽象,而不說依賴細節?而且還符合開閉原則!
所以什麼是依賴倒置?先看幾個概念
抽象與細節,在Java中,抽象就是指介面或者抽象類,兩者都是不能直接被例項化的;細節就是實現類,實現介面或者繼承抽象類而產生的就是細節,以關鍵字new產生物件。
高層和低層,通俗來講高層模組就是呼叫端,低層模組就是具體實現類。上面的例子中driver就是高層,car就是低層。
其核心思想是:要面向介面程式設計,不要面向實現程式設計。拓展一下
圖片載入框架,常規使用Glide直接load res到imageview,這是強依賴,而符合依賴倒置原則的做法是 抽象一層xxx.load res 到imageview,而xxx是一個抽象類,具體的實現可以是Glide,也可以是Fresco。這就是依賴倒置