設計模式六大原則:依賴倒置原則

来源:https://www.cnblogs.com/az4215/archive/2019/09/09/11462878.html
-Advertisement-
Play Games

目錄: 設計模式六大原則:單一職責原則:https://www.cnblogs.com/az4215/p/11462818.html 設計模式六大原則:介面隔離原則:https://www.cnblogs.com/az4215/p/11481076.html 設計模式六大原則:依賴倒置原則:http ...


目錄: 

  設計模式六大原則:單一職責原則

  設計模式六大原則:介面隔離原則 

  設計模式六大原則:依賴倒置原則

  設計模式六大原則:里氏替換原則

  設計模式六大原則:迪米特法則

  設計模式六大原則:開閉原則

依賴倒置原則(Dependence Inversion Principle):  

  1、高層模塊不應該依賴底層模塊,二者都應該依賴抽象。

  2、抽象不應該依賴細節,細節應該依賴抽象。

  3、依賴倒置的中心思想是面向介面編程。

  4、依賴倒置原則是基於這樣的設計理念:相對於細節的多變性,抽象的東西要穩定的多。以抽象為基礎搭建的架構比以細節為基礎搭建的架構要穩定的多。

  5、使用介面或抽象類的目的是指定好規範,而不涉及任何具體的操作,把展現細節的任務交給他們的實現類來完成。

經典案例:

  三二班有個小明,想要學習C#,於是買了本《深入理解C#》進行學習。 

 1 internal class Program
 2 {
 3     private static void Main(string[] args)
 4     {
 5         XiaoMing xm = new XiaoMing();
 6         xm.Study(new CSharp());
 7     }
 8 }
 9 
10 internal class CSharp
11 {
12     public void ShowMsg()
13     {
14         Console.WriteLine("《深入理解C#》");
15     }
16 }
17 
18 internal class XiaoMing
19 {
20     public void Study(CSharp cSharp)
21     {
22         cSharp.ShowMsg();
23     }
24 }
view code

  過了一段時間,小明覺得光學習一門太沒有意思了。聽說Linux比較好玩,於是買了本《鳥哥的私房菜Linux》。

 1 internal class Program
 2 {
 3     private static void Main(string[] args)
 4     {
 5         XiaoMing xm = new XiaoMing();
 6         xm.Study(new CSharp());
 7         xm.Study(new Linux());
 8     }
 9 }
10 
11 internal class CSharp
12 {
13     public void ShowMsg()
14     {
15         Console.WriteLine("《深入理解C#》");
16     }
17 }
18 
19 internal class Linux
20 {
21     public void ShowMsg()
22     {
23         Console.WriteLine("《鳥哥的私房菜Linux》");
24     }
25 }
26 
27 internal class XiaoMing
28 {
29     public void Study(CSharp cSharp)
30     {
31         cSharp.ShowMsg();
32     }
33 
34     public void Study(Linux linux)
35     {
36         linux.ShowMsg();
37     }
38 }
view code

  小明是一個聰明的娃,過了一段時間學得差不多了,於是又想學習《設計模式》...就這樣小明在不斷學習中成長,而我們的代碼卻越來越臃腫,變得難以維護。由於XiaoMing是一個高級模塊並且是一個細節實現類,此類依賴了書籍CSharp和Linux又是一個細節依賴類,這導致XiaoMing每讀一本書都需要修改代碼,這與我們的依賴倒置原則是相悖的。那如何解決XiaoMing的這種問題呢? 

 1 internal class Program
 2 {
 3     private static void Main(string[] args)
 4     {
 5         XiaoMing xm = new XiaoMing();
 6         xm.Study(new CSharp());
 7         xm.Study(new Linux());
 8     }
 9 }
10 
11 internal interface IBook
12 {
13     void ShowMsg();
14 }
15 
16 internal class CSharp : IBook
17 {
18     public void ShowMsg()
19     {
20         Console.WriteLine("《深入理解C#》");
21     }
22 }
23 
24 internal class Linux : IBook
25 {
26     public void ShowMsg()
27     {
28         Console.WriteLine("《鳥哥的私房菜Linux》");
29     }
30 }
31 
32 internal class XiaoMing
33 {
34     public void Study(IBook book)
35     {
36         book.ShowMsg();
37     }
38 }
view code

  我們發現,只要讓XiaoMing依賴於抽象IBook,其他書籍依賴於該抽象,以後不管小明讀什麼書,哈哈都是so easy的。

依賴關係傳遞的三種方式:

  1、通過介面傳遞(上述示例) 

1 internal class XiaoMing
2 {
3     // 2.通過介面傳遞依賴對象
4     public void Study(IBook book)
5     {
6         book.ShowMsg();
7     }
8 }
view code

  2、通過構造方法傳遞  

 1 internal class XiaoMing
 2 {
 3     private IBook _book;
 4 
 5     // 1.通過構造函數傳遞依賴對象
 6     public XiaoMing(IBook book)
 7     {
 8         this._book = book;
 9     }
10 
11     public void Study()
12     {
13         this._book.ShowMsg();
14     }
15 }
view code

  3、通過Setter方法傳遞  

 1 internal class XiaoMing
 2 {
 3     private IBook _book;
 4 
 5     // 3.通過Setter方法傳遞依賴對象
 6     public void setBook(IBook _book)
 7     {
 8         this._book = _book;
 9     }
10 
11     public void Study()
12     {
13         this._book.ShowMsg();
14     }
15 }
view code

依賴倒置原則的本質就是通過抽象(介面或抽象類)使各個類或模塊的實現彼此獨立,不互相影響,實現模塊間的松耦合。我們在項目中使用這個原則要遵循下麵的規則:

  1、每個類儘量都有介面或者抽象類,或者抽象類和介面兩都具備

  2、變數的錶面類型儘量是介面或者抽象類

  3、任何類都不應該從具體類派生

  4、儘量不要覆寫基類的方法

  5、如果基類是一個抽象類,而這個方法已經實現了,子類儘量不要覆寫。類間依賴的是抽象,覆寫了抽象方法,對依賴的穩定性會有一定的影響

  6、結合里氏替換原則使用


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

-Advertisement-
Play Games
更多相關文章
  • 用easyui實現查詢條件的後端傳遞並自動刷新表格的兩種方法 搜索框如下: 通過datagrid的load方法直接傳遞參數並自動刷新表格 通過ajax的post函數傳遞參數並通過loadData方法將數據初始化到表格中 js代碼(搜索按鈕的點擊事件部分): $("#standardQueryBtn" ...
  • 在小伙伴們開發微信公眾號、小程式或者是在微信內置瀏覽器打開的項目時,會遇到的第一個問題就是如何獲取openId,今天小編就給大家帶來的是如何獲取openId。 首先 我們要從微信開發者後臺得到appid,這個appid是管理員在設置微信後臺時獲取的,而且是唯一的,而且還需要在微信後臺設置回調功能變數名稱。 ...
  • sessionStorage和localStorage的基本用法 ...
  • 由於狀態零散地分佈在許多組件和組件之間的交互中,大型應用複雜度也經常逐漸增長。為瞭解決這個問題,Vue 提供 vuex。 一、什麼是Vuex Vuex 是一個專為 Vue.js 應用程式開發的 狀態管理模式 。它採用集中式存儲管理應用的所有組件的狀態,並以相應的規則保證狀態以一種可預測的方式發生變化 ...
  • 第一章 架構基礎 模塊與組件 模塊:從邏輯角度拆分,主要目的是職責分離 組件:從物理角度拆分,主要目的是單元復用 框架與架構 框架:組件規範(開發規範),提供基礎功能的產品。 架構:對軟體系統結構的描述 架構設計的目的是什麼? 軟體架構的歷史 第一次軟體危機——結構化程式設計登場 2000名程式員歷 ...
  • 本文主要給大家介紹,在實際業務中,業務中台到底該如何建設,如何將中台的能力優雅的與前端業務線結合起來。 ...
  • 阿裡巴巴在2015年12月進行組織升級,就是“大中台,小前臺”的模式。主要的思路是打破原來樹狀結構,小前臺距離一線更近,業務全能,這樣便於快速決策、敏捷行動;支持類的業務放在中台,扮演平臺支撐的角色。 ...
  • 目錄: 設計模式六大原則:單一職責原則:https://www.cnblogs.com/az4215/p/11462818.html 設計模式六大原則:介面隔離原則:https://www.cnblogs.com/az4215/p/11481076.html 設計模式六大原則:依賴倒置原則:http ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...