極客大學架構師訓練營--編程的未來 面向對象 依賴倒置原則 -- 第二次作業

作業一:

請描述什麼是依賴倒置原則,爲什麼有時候依賴倒置原則又被稱爲好萊塢原則?

依賴倒置原則 官方解釋

依賴倒置原則,英文縮寫DIP,全稱Dependence Inversion Principle。

原始定義: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。

官方翻譯:高層模塊不應該依賴低層模塊,兩者都應該依賴其抽象;抽象不應該依賴細節,細節應該依賴抽象。

依賴倒置原則 程序員理解

  1. 應用代碼中多使用抽象接口,儘量避免使用那些多變的具體實現類。
  2. 不要繼承具體類,如果一個類在設計之初不是抽象類,那麼儘量不要去繼承它。對具體的繼承是一種強依賴關係,維護的時候難以改變。
  3. 不要重寫包含具體實現的函數.

依賴倒置舉例

相比傳統的軟件設計架構,比如我們常說的經典的三層架構,Controller層依賴於Service層,Service層依賴於DAO層。由於每一層都是依賴於下層的實現,這樣當某一層的結構發生變化時,它的上層就不得不也要發生改變,比如我們DAO裏面邏輯發生了變化,可能會導致Service和Controller層都隨之發生變化,這種架構是非常荒謬的!

好,這個時候如果我們換一種設計思路,高層模塊不直接依賴低層的實現,而是依賴於低層模塊的抽象,具體表現爲我們增加一個IController接口(比如註冊場景的Iregister),裏面定義業務邏輯的接口,Controller層依賴於IController接口,Service層實現IController裏面的接口,所以具體的業務邏輯則定義在Service,這個時候如果我們Service裏面的邏輯發生變化,只要接口的行爲不變,上層Controller裏面就不用發生任何變化。

在經典的三層裏面,高層模塊直接依賴低層模塊的實現,當我們將高層模塊依賴於底層模塊的抽象時,就好像依賴“倒置”了。這就是依賴倒置的由來。通過依賴倒置,可以使得架構更加穩定、更加靈活、更好應對需求變化。

好萊塢模式

爲什麼稱爲好萊塢原則,該原則是和好萊塢模式類似,don’t call me ,i will call you

作業二:

請描述一個你熟悉的框架,是如何實現依賴倒置原則的。

JDBC 我們在java開發中訪問數據庫,代碼並不直接依賴數據庫驅動,而是依賴JDBC,當應用程序需要更換數據庫,不需要修改任何代碼。這正是因爲應用代碼,高層模塊,不依賴數據庫驅動,而是依賴抽象JDBC,而數據庫驅動,作爲底層模塊,也依賴JDBC。

Tomcat、Spring 都是基於這個原則設計出來的,應用程序不需要調用Tomcat或者Spring這樣的框架,而是框架調用應用程序。而實現這一特性的前提就是應用程序必須實現框架的接口規範,比如實現Servlet接口。

框架提供框架核心功能,比如HTTP處理,MVC等,並提供一組接口規範,應用程序只需要遵循接口規範編程,就可以被框架調用。程序使用框架的功能,但是不調用框架的代碼,而是實現框架的接口,被框架調用,從而框架有更高的可複用性,被應用於各種軟件開發中。

依賴倒置原則通俗說就是,高層模塊不依賴底層模塊,而是都是依賴抽象接口,這個抽象接口通常是由高層模塊定義,底層模塊實現。

作業三:

請用接口隔離原則優化 Cache 類的設計,畫出優化後的類圖。
在這裏插入圖片描述

作業三提示:cache 實現類中有四個方法,其中 put get delete 方法是需要暴露給應用程序的,rebuild 方法是需要暴露給系統進行遠程調用的。如果將 rebuild 暴露給應用程序,應用程序可能會錯誤調用 rebuild 方法,導致 cache 服務失效。按照接口隔離原則:不應該強迫客戶程序依賴它們不需要的方法。也就是說,應該使 cache 類實現兩個接口,一個接口包含 get put delete 暴露給應用程序,一個接口包含 rebuild 暴露給系統遠程調用。從而實現接口隔離,使應用程序看不到 rebuild 方法。

類圖

在這裏插入圖片描述
說明:

  1. IClientCache 接口的方法暴露給程序調用,包含的方法有 put get delete
  2. IRemoteCache 接口的方法,只能通過RemoteCache實現類實現,包含方法reBuild。
  3. MainCache 聚合了RemoteCache, 存儲爲私有變量,以防被程序調用。

參考

https://blog.csdn.net/zhengzhb/article/details/7289269

https://zhuanlan.zhihu.com/p/24175489

https://www.liangzl.com/get-article-detail-165434.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章