您好,登錄后才能下訂單哦!
本篇內容介紹了“java設計原則的依賴倒置原則是什么”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
依賴倒置原則是系統解耦的重要原則,遵循它可以讓我們的系統更加健壯。
依賴倒置原則(Dependency Inversion Principle)是 Robert C. Martin 提出的,原則聲明了兩個方面:
上層模塊不應該依賴下層模塊,雙方都應依賴于抽象。
抽象不應依賴實現,實現應該依賴抽象。
依賴倒置原則的聲明中有幾個概念:上層、下層,抽象、實現。
上層、下層是一類概念,在計算機的設計中,分層是常見的任務分解方法,每一層都使用下層提供的功能,又為更上層提供自己的功能。依賴倒置原則要求在設計層間通信、交互標準時,不應依賴于某個下層,而是應該依賴于抽象,這樣上下層之間就沒有強耦合,如果兩個實現都遵循了同樣的抽象,則可以在上層無感知的情況下替換下層實現。
抽象、實現是一類概念,抽象是對同一類任務本質屬性的表達,實現則是具體每一類任務的細節的表達。依賴倒置原則說明實現應該依賴于抽象,是因為實現是對抽象骨架的填充,而抽象不應依賴于實現,是因為抽象是對本質的歸納,應去掉細節的干擾。
看了上面的規則,還需要問一下依賴倒置原則倒置了什么呢?
從字面看依賴倒置當然是倒置了依賴,但核心是控制權的反轉。我們從下面的例子來解釋。
需求要求實現一個排序系統,系統需要實現各種排序算法,使用方可以根據需要調用不同的排序算法來對自己的數據進行排序。
設計的接口如下:
public interface Sort { public void sort(int[] nums); }
有不同的排序算法實現:
public class QuickSort { public void sort(int[] nums) { //quick sort implementation ... } } public class MergeSort { public void sort(int[] nums) { //merge sort implementation ... } } public class BubbleSort { public void sort(int[] nums) { //bubble sort implementation ... } } ......
使用方使用:
public class Client { public static void main(String[] args) { Sort sort = new QuickSort(); int[] nums = new int[10]; // initial nums sort.sort(nums); } }
可以看到,使用方在使用的時候依賴的是抽象的Sort
接口,但是接口是沒法實例化的,因此第一句 Sort sort = new QuickSort();
將實現實例化后賦值給變量,這里,使用方作為上層模塊就依賴了下層實現,違反了依賴倒置原則。
要解決這個問題,需要將實例化的過程遷移到排序系統中,使用方通過配置、參數等方式選擇自己要使用的算法,這樣使用方就不依賴排序系統具體的實現,而只依賴于Sort
的接口抽象。
我們實現一種由排序系統智能判斷返回排序算法的簡單工廠。
public final class SortFactory { private static final int SIZE_THRESHOLD = 300; public static Sort choose (int sortSize) { if (sortSize < SIZE_THRESHOLD) { return new BubbleSort(); } return new QuickSort(); } }
使用方在在使用時直接使用 Sort sort = SortFactory.choose(size)
的形式來獲得排序實例即可。
從這個例子中,我們可以看到,實例化的控制權原本是在使用方的手中,但這樣就將抽象與實現耦合在了一起,后面我們使用簡單工廠模式將控制權交回到排序系統,使用方就只需要調用工廠方法來獲取實例即可而無需關心具體實現了。
“java設計原則的依賴倒置原則是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。