融會貫通——深入瞭解面向對象設計原則“依賴倒轉原則”

来源:http://www.cnblogs.com/Evsward/archive/2017/09/06/DIP.html
-Advertisement-
Play Games

一千個人眼裡有一千個哈姆雷特,下麵我嘗試用深入淺出的語言貫穿到“控制反轉”,“依賴註入”,“面向抽象編程”,以及“面向介面編程”這幾個概念。 傳遞參數,關聯(組合&聚合)關係時,要儘量引用高層次的抽象類,使用基類和介面進行變數類型的聲明,參數類型的聲明,數據類型轉換(也是向高層次的抽象類轉),而不要 ...


一千個人眼裡有一千個哈姆雷特,下麵我嘗試用深入淺出的語言貫穿到“控制反轉”,“依賴註入”,“面向抽象編程”,以及“面向介面編程”這幾個概念。

 

傳遞參數,關聯(組合&聚合)關係時,要儘量引用高層次的抽象類,使用基類和介面進行變數類型的聲明,參數類型的聲明,數據類型轉換(也是向高層次的抽象類轉),而不要用具體的子類。

以上總結為“控制反轉”,也叫“面向抽象編程”。

 

真到了要使用具體子類的時候,採用“依賴註入”的方式:

  •   構造註入,通過構造函數傳入具體類的對象
  •   setter註入,通過setter方法傳入具體類的對象
  •   介面註入,通過在介面中聲明的業務方法,來傳入具體類的對象作為方法的參數

  ——> 引申到“面向介面編程”的概念,介面的意思就是“如果你是***的話,你能幹嘛?”,介面中定義的是能幹嘛,具體怎麼乾不告訴你,等你是了(即實現該介面)自己去想具體怎麼乾。

介面是抽象概念的一種,當你在面向抽象編程時,傳遞參數,關聯關係,使用的是介面來聲明變數類型,參數類型以及數據類型轉換,而不是具體的類,這就是面向介面編程。

所以,總結出這些概念的關係是,面向對象編程的中心思想是面向抽象編程,而面向介面編程是面向抽象編程的一種。

 

那麼問題又來了,如果面向介面編程只是面向抽象的一種,那麼另一種是什麼呢?

另一種就是抽象基類,要註意區分這裡的基類的概念,它包含abstract關鍵字的class,也包含普通父類(普通父類也是其眾多子類的抽象化身),這裡主要多說一下abstract class,它很容易與介面混淆,那麼abstract class與介面的區別是什麼?

  • abstract class可以包含有方法體的非抽象方法,可以包含任意作用域的成員數據。而介面一般不使用成員數據(即使有也是自動轉為public static final類型),介面的所有方法都是沒有方法體的抽象方法(介面內部不用abstract關鍵字)。
  • abstract class是對屬性,行為的抽象,同時也可以有自己的具體方法。而介面只是對行為的抽象,介面更像是abstract class的特殊情況。
  • 這兩種不同的抽象概念更好的支持了Java多態(一個基類可以有很多子類is-a,一個類可以實現很多介面like-a)。abstract class仍然是個類,必須是相同種族抽象出來的類,例如動物類,熊貓類,而介面只是對行為的抽象,不管誰實現他,也不管他們是否是一個種族,例如動物和汽車都可以跑,那他們都可以實現具有“跑”行為的介面,對於介面本身來講,他並不關心你是動物還是汽車,他只管定義他的“跑”就行了。

 

依賴倒轉原則,總結一句話就是定義時用抽象類型(基類或者介面),運行時註入具體類型,開閉原則是目標,里氏代換原則是基礎,依賴倒轉原則是手段。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 團隊更換新框架。新的業務全部使用新的框架,甚至是新的資料庫 Mysql。 這邊之前一直是使用oracle,各種訂單號、流水號、批次號啥的,都是直接使用oracle的sequence提供的數字序列號。現在資料庫更換成Mysql了,顯然以前的老方法不能適用了。 需要新寫一個: 分散式場景使用 滿足一定的 ...
  • 例1:y'=ry(1-y/K) y(0)=2 對應的R代碼為: library(deSolve)#parameters and initial valuesr<-1K<-10yini<-2#the function derivs<-function(t,y,parms){ return(list(r ...
  • package test; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.Timer;... ...
  • 怎樣學習才能從一名Java初級程式員成長為一名合格的架構師,或者說一名合格的架構師應該有怎樣的技術知識體系,這是不僅一個剛剛踏入職場的初級程式員也是工作三五年之後開始迷茫的老程式員經常會問到的問題。希望這篇文章會是你看到過的最全面最權威的回答。 一: 編程基礎 不管是C還是C++,不管是Java還是 ...
  • 有的時候需要根據要查詢的參數動態的拼接SQL語句 常用標簽: - if:字元判斷 - choose【when...otherwise】:分支選擇 - trim【where,set】:字元串截取,其中where標簽封裝查詢條件,set標簽封裝修改條件 - foreach: if案例 1)在Employ ...
  • 一。概念 提供一個創建一系列相關或相互依賴對像的介面,而無需指定它們具體的類。 二。模式動機 這一系列對像之間是相互依賴的,相當於一個產品族 三。模式的結構 通過上圖我們可以清楚的看到抽像工廠模式包括以下4個角色: 1.抽像工廠角色(AbstractFactory):抽像工廠模式的核心,與具體的商業 ...
  • 設計模式根據使用類型可以分為三種:1、 創建模式: Factory (工廠模式)、 Singleton (單態)、 Builder ( (建造者模式)、 Prototype ( (原型模式)、工廠方法模式。 2、 結構模式: Flyweight ( (共用模式)、 Bridge ( (橋模式)、 D ...
  • 1. 創建報表 在創建好數據源之後,我們就可以創建報表了,報表的開發是瀏覽器中完成的,這裡我選用了chrome瀏覽器,在地址欄輸入:http://localhost:80/ibmcognos (該地址在第二章節“啟動Cognos服務”中有提到) 1.1. 首頁介紹 主要講解一下整個界面的功能佈局,如 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...