對於設計原則——依賴倒轉原則的一些個人理解
依賴倒轉原則
什麼是依賴倒轉原則呢?
先舉個例子,用造汽車舉例子:
假如,造汽車的第一步是:造車輪
第二步是:根據車輪的大小造車底
第三步是:根據車底的大小造車身
最後一步是:根據車身的大小造出汽車。
那麼這個過程中的依賴關係是:汽車依賴於車身的設計,車身依賴於車底的設計,車底依賴於車輪的設計。
粗略的看,這樣的設計邏輯是沒有問題的,各部分「零件」都互相依賴著,最後也能夠把汽車組裝成功,可是,這樣的設計邏輯存在一個很大的問題,是什麼呢?
——可維護性差
假如,現在和你們造汽車的工廠對接的客戶說,我要求現在生產的汽車輪胎能夠大個尺寸,那麼就會有一個很嚴重的問題,就是要重新的設計車底,車身,汽車,這可以說是「牽一髮而動全身」。
那麼這個時候,如果我們換一種思維,先造汽車,再造車身,其次造車底,最後造車輪。這樣子的話,如果造汽車的依賴關係就倒轉過來了,變成了:車輪依賴於車底的設計,車底依賴於車身的設計,車身依賴於汽車的設計。
這時候要是改動輪子的話是不是就不需要改動汽車了?嗯…沒錯,粗略看過去是這樣的,可是,還是有問題啊,如果我要直接改動汽車呢?那不是還是得全部都要改動?是的,沒錯,全部都要改動。
那我舉上面的例子有什麼用呢?嗯,有大用哦;網上百度一波,依賴倒轉原則它的概念是:
1:高層模塊不應該依賴於底層模塊,兩者都應該依賴於其抽象。
2:抽象不應該依賴具體實現,具體實現應該依賴抽象(看介面和實現類的關係)。
第一條概念說兩者依賴於其抽象,那麼在上面的造汽車,不管是從輪子(底層)開始,還是汽車(高層)開始都是從具體實現下手的,所以上面的舉例不是依賴倒轉原則。
其依賴倒轉的核心思想是:面向介面編程
接下來造汽車的例子我就放在編程中說了:
首先,要創建四個介面,分別是,輪子,車底,車身,汽車。這四個介面里各自約定一些方法,比如說輪子的介面中,寫一個帶參的輪子尺寸方法。然後比如造汽車,造的是小轎車輪子的話,那麼寫一個實現這個介面的實現類,類名是小轎車車輪。要是現在突然又有新的需求,要造卡車輪子,那再寫一個實現類來實現這個車輪的介面即可,其實這裡用到了一個其他的原則(開閉原則:對修改關閉,對擴展開放),介面中的方法呢,是之前約定好的東西,是不允許修改的,這裡的不允許不是指真的不允許,而是有悖於設計原則的開閉原則,一個簡單又好記的方法就是:介面的存在最主要的目的就是為了便於擴展、和維護。
總之,依賴倒轉原則是針對介面的,高層模塊和底層模塊都是依賴於抽象(介面)的。
![](https://pic.pimg.tw/zzuyanan/1488615166-1259157397.png)
![](https://pic.pimg.tw/zzuyanan/1482887990-2595557020.jpg)
※推進微服務落地的 7 個步驟
※當Golang遇到高並發秒殺,世界開始變得簡單
TAG:千鋒JAVA開發學院 |