設計模式系列(03):設計原則(二):DIP、ISP、LoD

本文為設計模式系列第3篇,聚焦依賴倒置、接口隔離、迪米特法則三大設計原則,系統梳理定義、實際業務場景、優缺點、最佳實踐與常見誤區,適合系統學習與團隊協作。


目錄

  • 1. 引言
  • 2. 依賴倒置原則(DIP)
  • 3. 接口隔離原則(ISP)
  • 4. 迪米特法則(LoD)
  • 5. 常見誤區與反例
  • 6. 最佳實踐
  • 7. 參考資料與延伸閱讀

1. 引言

在上一文中,我們介紹了單一職責、開放封閉和里氏替換原則。本文將繼續介紹另外三大設計原則:依賴倒置原則(DIP)、接口隔離原則(ISP)、迪米特法則(LoD)。這些原則是構建靈活、可擴展、易維護系統的基礎。理解并應用這些原則,可以有效降低系統耦合度,提升代碼質量。

2. 依賴倒置原則(DIP)

2.1 定義與背景

依賴倒置原則(Dependency Inversion Principle, DIP)要求高層模塊不應該依賴低層模塊,二者都應該依賴其抽象。抽象不應該依賴細節,細節應該依賴抽象。通過依賴抽象而非具體實現,可以讓系統更加靈活和可擴展。

2.2 應用場景

DIP常用于分層架構中,如業務層與數據層的解耦。依賴注入和IoC容器的廣泛應用,也是DIP的體現。插件式架構、可插拔模塊等也都依賴于依賴倒置原則來實現靈活擴展。

2.3 代碼示例

// 不符合DIP的寫法
public class OrderService {private MySQLOrderRepository repository = new MySQLOrderRepository(); // 直接依賴具體實現,違反DIPpublic void createOrder(Order order) {// 業務邏輯System.out.println("創建訂單: " + order.getId());repository.save(order);}
}
class MySQLOrderRepository {public void save(Order order) {System.out.println("[MySQL] 保存訂單: " + order.getId());}
}
class Order {private String id;public Order(String id) { this.id = id; }public String getId() { return id; }
}
// 使用示例
public class Main {public static void main(String[] args) {OrderService service = new OrderService();service.createOrder(new Order("A1001"));}
}// 符合DIP的寫法
// 訂單倉儲接口,定義抽象
public interface OrderRepository {void save(Order order);
}
// MySQL實現,依賴于抽象
public class MySQLOrderRepository implements OrderRepository {

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/80407.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/80407.shtml
英文地址,請注明出處:http://en.pswp.cn/web/80407.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

計算機圖形學中MVP變換的理論推導

計算機圖形學中MVP變換的理論推導 課程地址:Computing the Pixel Coordinates of a 3D Point 知識鋪墊:矩陣的真實內涵 矩陣的每一列/行(左乘和右乘的區別)代表了新坐標系的基向量在原基向量構成的坐標系中的坐標,這…

先說愛的人為什么先離開

2025年5月19日,15~23℃,賊好的一天,無事發生 待辦: 2024年稅務申報 《高等數學2》取消考試資格學生名單 《物理[2]》取消考試資格名單 5月24日、25日監考報名 《高等數學2》備課 《物理[2]》備課 職稱申報材料 教學技能大賽PPT 遇…

面試中的線程題

原文鏈接:線程題大全 Java 并發庫同步輔助類 CountDownLatch 工作機制:初始化一個計數器,此計數器的值表示需要等待的事件數量。 提供了兩個主要方法: await():當一個線程調用此方法時,它將阻塞&#…

Linux夢開始的地方

1.概率 經過C語言,數據結構,C的學習我們現在要開始學習Linux的學習了。我們學習Linux是從四部分來進行的: 1.Linux初識,Linux環境,Linux指令,Linux開發環境。 2.Linux系統。 3.Linux網絡 4.MySQL Lin…

“二維前綴和”算法原理及模板

在學習本篇內容前建議先學習一下“一維前綴和” 一維前綴和 算法https://blog.csdn.net/czt230610/article/details/148012923?fromshareblogdetail&sharetypeblogdetail&sharerId148012923&sharereferPC&sharesourceczt230610&sharefromfrom_link接下來…

軟件設計師CISC與RISC考點分析——求三連

一、考點分值占比與趨勢分析(CISC與RISC) 綜合知識分值統計表 年份考題數量分值分值占比考察重點2018111.33%指令特征對比2019111.33%控制器實現方式2020222.67%寄存器數量/流水線技術2021111.33%尋址方式對比2022222.67%指令復雜度/譯碼方式2023111.3…

順 序 表:數 據 存 儲 的 “ 有 序 陣 地 ”

順 序 表:數 據 存 儲 的 “ 有 序 陣 地 ” 線 性 表順 序 表 - - - 順 序 存 儲 結 構順 序 表 的 操 作 實 現代 碼 全 貌 與 功 能 介 紹順 序 表 的 功 能 說 明代 碼 效 果 展 示代 碼 詳 解SeqList.hSeqList.ctest.c 總 結 💻作 者 簡 介&#xf…

網絡安全深度解析:21種常見網站漏洞及防御指南

一、高危漏洞TOP 10 1. SQL注入(SQLi) 原理:通過構造惡意SQL語句突破系統過濾機制 典型場景: - 聯合查詢注入: union select 1,version(),3--+ - 布爾盲注:and (select substr(user(),1,1)=r) - 時間盲注:;if(now()=sysdate(),sleep(5),0)/ 防御方案: - 嚴格參數化查…

代碼上傳gitte倉庫

把代碼push上去就行

創建型:單例模式

目錄 1、核心思想 2、實現方式 2.1 餓漢式 2.2 懶漢式 2.3 枚舉(Enum) 3、關鍵注意事項 3.1 線程安全 3.2 反射攻擊 3.3 序列化與反序列化 3.4 克隆保護 4、適用場景 1、核心思想 目的:確保一個類僅有一個實例 功能:…

副業小程序YUERGS,從開發到變現

文章目錄 我為什么寫這個小程序網站轉小程序有什么坑有什么推廣渠道個人開發者如何變現簡單介紹YUERGS小程序給獨立開發者一點小建議 我為什么寫這個小程序 關注我的粉絲應該知道,我在碩士階段就已經掌握了小程序開發技能,并寫了一個名為“約球online”…

React路由(React學習筆記_09)

React路由 1,路由基礎 現代的前端應用大多都是SPA(單頁應用程序),也就是只有一個HTML頁面的應用程序。因為它的用戶體驗更好、對服務器的壓力更小,所以更受歡迎。為了有效的使用單個頁面來管理原來多個頁面的功能,前端路由應運而生。 1, 安裝…

2009-2025計算機408統考真題及解析

整理2009-2025 年計算機408統考真題及解析PDF 目錄樹: └── 2025考研計算機408統考真題及答案(回憶版).pdf ├── 2009-2024計算機408真題解析 │ ├── 2009年計算機408統考真題解析.pdf │ ├── 2010年計算機408統考真題解析.pdf …

Mysql、Oracle、Sql Server、達夢之間sql的差異

1&#xff1a;分頁查詢 Sql Server&#xff1a; <bind name"startRow" value"(page - 1) * limit 1"/> <bind name"endRow" value"page * limit"/> SELECT *FROM (SELECT ROW_NUMBER() OVER (<if test"sortZd!…

SQL Server 常用函數

一、字符串處理函數 1. CONCAT&#xff1a;拼接字符串 語法&#xff1a;CONCAT(string1, string2, ..., stringN) 實例&#xff1a; SELECT CONCAT(Hello, , World) AS Result; 輸出&#xff1a; Result ------------- Hello World 2. SUBSTRING&#xff1a;截取子字符串 …

【通用大模型】Serper API 詳解:搜索引擎數據獲取的核心工具

Serper API 詳解&#xff1a;搜索引擎數據獲取的核心工具 一、Serper API 的定義與核心功能二、技術架構與核心優勢2.1 技術實現原理2.2 對比傳統方案的突破性優勢 三、典型應用場景與代碼示例3.1 SEO 監控系統3.2 競品廣告分析 四、使用成本與配額策略五、開發者注意事項六、替…

ABP vNext 多租戶系統實現登錄頁自定義 Logo 的最佳實踐

&#x1f680; ABP vNext 多租戶系統實現登錄頁自定義 Logo 的最佳實踐 &#x1f9ed; 版本信息與運行環境 ABP Framework&#xff1a;v8.1.5.NET SDK&#xff1a;8.0數據庫&#xff1a;PostgreSQL&#xff08;支持 SQLServer、MySQL 等&#xff09;BLOB 存儲&#xff1a;本地…

FastDFS分布式文件系統架構學習(一)

FastDFS分布式文件系統架構學習 1. FastDFS簡介 FastDFS是一個開源的輕量級分布式文件系統&#xff0c;由淘寶資深架構師余慶設計并開發。它專為互聯網應用量身定制&#xff0c;特別適合以中小文件&#xff08;如圖片、文檔、音視頻等&#xff09;為載體的在線服務。FastDFS不…

基于單片機的防盜報警器設計與實現

標題:基于51單片機的防盜報警器設計 內容:1.摘要 本文圍繞基于51單片機的防盜報警器設計展開。背景在于現代社會安全需求不斷提高&#xff0c;傳統防盜方式存在諸多不足。目的是設計一款成本低、可靠性高且易于使用的防盜報警器。方法上&#xff0c;以51單片機為核心控制單元&…

IDE/IoT/搭建物聯網(LiteOS)集成開發環境,基于 LiteOS Studio + GCC + JLink

文章目錄 概述LiteOS Studio不推薦&#xff1f;安裝和使用手冊呢?HCIP實驗的源碼呢&#xff1f; 軟件和依賴安裝軟件下載軟件安裝插件安裝依賴工具-方案2依賴工具-方案1 工程配置打開或新建工程板卡配置組件配置編譯器配置-gcc工具鏈編譯器配置-Makefile腳本其他配置編譯完成 …