1. 程式人生 > 其它 >依賴倒置原則的理解

依賴倒置原則的理解

技術標籤:Java基礎抽象類設計模式java介面

一直不太理解這個原則,直到看到了這個例子:

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。這就是依賴倒置