Java設計模式之依賴倒置原則使用舉例說明

示例1:司機駕駛汽車

問題場景:司機類直接依賴奔馳車類,新增寶馬車需修改司機類代碼。

// 未遵循DIP
class Benz { public void run() { /*...*/ } }
class Driver { public void drive(Benz benz) { benz.run(); } 
}
// 遵循DIP:引入接口ICar
interface ICar { void run(); }
class Benz implements ICar { /*...*/ }
class BMW implements ICar { /*...*/ }
class Driver { public void drive(ICar car) { car.run(); } 
}

效果:新增汽車類型(如BMW)無需修改Driver類,僅需實現ICar接口。


示例2:用戶接收消息

問題場景:用戶類直接依賴郵件類,新增微信或短信需修改用戶類。

// 未遵循DIP
class Email { public String getInfo() { /*...*/ } }
class Person { public void receive(Email email) { /*...*/ } 
}
// 遵循DIP:引入接口IReceiver
interface IReceiver { String getInfo(); }
class Email implements IReceiver { /*...*/ }
class WeChat implements IReceiver { /*...*/ }
class Person { public void receive(IReceiver receiver) { /*...*/ } 
}

效果:新增消息類型(如WeChat)無需修改Person類,僅需實現IReceiver接口。


示例3:購物場景

問題場景:顧客類直接依賴具體商品類(如漢堡、薯條),新增商品需修改顧客類。

// 未遵循DIP
class Hamburger { public void eat() { /*...*/ } }
class Person { public void buy(Hamburger hamburger) { hamburger.eat(); } 
}
// 遵循DIP:引入接口IDishes
interface IDishes { void eat(); }
class Hamburger implements IDishes { /*...*/ }
class Chips implements IDishes { /*...*/ }
class Person { public void buy(IDishes dishes) { dishes.eat(); } 
}

效果:新增商品類型(如Chips)無需修改Person類,僅需實現IDishes接口。


示例4:通知服務

問題場景:通知服務直接依賴郵件發送類,更換短信服務需修改通知邏輯。

// 未遵循DIP
class EmailService { public void sendEmail(String msg) { /*...*/ } }
class NotificationService { public void send(String msg) { new EmailService().sendEmail(msg); } 
}
// 遵循DIP:引入接口MessageSender
interface MessageSender { void sendMessage(String msg); }
class EmailService implements MessageSender { /*...*/ }
class SMSService implements MessageSender { /*...*/ }
class NotificationService { private MessageSender sender; public NotificationService(MessageSender sender) { this.sender = sender; } public void send(String msg) { sender.sendMessage(msg); } 
}

效果:通過構造器注入依賴,更換消息服務(如SMSService)僅需修改調用層。


依賴傳遞的三種方式

  1. 接口傳遞:通過方法參數傳遞抽象(如Driver.drive(ICar car))。
  2. 構造器注入:通過構造函數依賴注入(如NotificationService依賴MessageSender)。
  3. Setter注入:通過Setter方法動態注入依賴(如public void setSender(MessageSender sender))。

DIP的核心優勢

  1. 降低耦合性:模塊間通過抽象交互,減少直接依賴。
  2. 提高擴展性:新增功能只需添加實現類,無需修改高層邏輯(符合開閉原則)。
  3. 支持并行開發:接口定義后,高低層模塊可獨立開發與測試(如TDD模式)。
  4. 增強可維護性:變更影響范圍受限于低層模塊,減少風險。

總結

依賴倒置原則通過抽象(接口/抽象類)實現模塊解耦,核心實踐包括:

  • 定義清晰的接口或抽象類作為模塊間的契約。
  • 使用依賴注入(構造器、Setter等)傳遞具體實現。
  • 高層模塊僅依賴抽象,低層模塊實現抽象。
    結合Spring框架的DI容器,可進一步自動化依賴管理,提升代碼復用性和靈活性。

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

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

相關文章

【Docker】openEuler 使用docker-compose部署gitlab-ce

docker-compose配置 services:gitlab:image: gitlab/gitlab-ce:latestcontainer_name: gitlabrestart: alwayshostname: gitlab.example.comenvironment:GITLAB_OMNIBUS_CONFIG: |# Add any other gitlab.rb configuration here, each on its own lineexternal_url https://gi…

ElasticSearch 父子文檔使用簡記

一. ES parent-child 文檔簡介 ES 提供了類似數據庫中 Join 聯結的實現,可以通過 Join 類型的字段維護父子關系的數據,其父文檔和子文檔可以單獨維護。 二. 父子文檔的索引創建與數據插入 ES 父子文檔的創建可以分為下面三步: 創建索引 M…

【Linux】編輯器vim的使用

目錄 1. vim的基本概念 2. vim的基本使用 3. vim命令模式操作 3.1 移動光標 3.2 刪除 3.3 復制 3.4 替換 3.5 撤銷 3.6 更改 3.7 跳轉 4. vim底行模式操作 4.1 列出行號 4.2 跳到文件中的某行 4.3 查找字符 4.4 保存文件 4.5 離開vim 1. vim的基本概念 Vim&…

《零基礎掌握飛算Java AI:核心概念與案例解析》

前引:飛算科技是一家專注于企業級智能化技術服務的公司,核心領域包括AI、大數據、云計算等。其Java AI解決方案主要面向企業級應用開發,提供從數據處理到模型部署的全流程支持!飛算Java AI是一款基于人工智能技術的Java開發輔助工…

Chrome騰訊翻譯插件transmart的安裝

文章目錄一、官網地址二、安裝過程1. 下載插件2. 解壓crx3, chrome安裝三、如何使用一、官網地址 騰訊翻譯插件官網 二、安裝過程 1. 下載插件 點擊上面的官網地址,下拉到如圖所示chrome插件位置,點擊立即下載 2. 解壓crx 從壓縮文件中解壓出crx文…

IOMMU的2級地址翻譯機制及多級(2~5)頁表查找

IOMMU的2級地址翻譯機制及多級(2~5)頁表查找 摘要:IOMMU是現代計算機系統中用于I/O設備(如GPU、NIC、網絡接口卡)的地址翻譯和保護機制,類似于CPU的MMU(Memory Management Unit),但專為設備DMA(Direct Memory Access,直接內存訪問)設計。它支持虛擬化環境(…

C++STL標準模板庫詳解

一、引言STL(Standard Template Library)是 C 標準庫的核心組成部分,其中容器(Containers) 作為數據存儲的基礎組件,為開發者提供了豐富的數據結構選擇。本文將聚焦 STL 容器的核心類型,結合具體…

神經網絡 常見分類

📚 神經網絡的常見分類方式可以從不同角度來劃分,以下是幾種主流思路,幫你快速梳理清晰:1?? 按網絡結構分類前饋神經網絡(Feedforward Neural Network, FNN) 數據從輸入層→隱藏層→輸出層單向傳遞&#…

生產環境Redis緩存穿透與雪崩防護性能優化實戰指南

生產環境Redis緩存穿透與雪崩防護性能優化實戰指南 在當下高并發場景下,Redis 作為主流緩存組件,能夠極大地提升讀寫性能,但同時也容易引發緩存穿透、緩存擊穿及緩存雪崩等問題,導致后端依賴數據庫的請求激增,系統穩定…

【洛谷刷題】用C語言和C++做一些入門題,練習洛谷IDE模式:分支機構(一)

🔥個人主頁:艾莉絲努力練劍 ?專欄傳送門:《C語言》、《數據結構與算法》、C語言刷題12天IO強訓、LeetCode代碼強化刷題、洛谷刷題、C/C基礎知識知識強化補充、C/C干貨分享&學習過程記錄 🍉學習方向:C/C方向 ??人…

嵌入式硬件篇---常見的單片機型號

以下是目前常用的單片機型號及其應用場景、優劣勢的詳細解析,結合最新行業動態和技術特性,幫助你精準匹配需求:一、經典 8 位單片機:低成本入門首選1. 51 系列(代表型號:AT89C51、STC89C52)應用…

windows下ArcGIS 10.8.2下載安裝教程

ArcGIS是由美國環境系統研究所(Esri)開發的一款功能強大且應用廣泛的綜合性地理信息系統(GIS)軟件平臺,在空間數據的采集、管理、分析、可視化和共享等方面表現出色,是GIS領域的標桿產品。它擁有豐富的功能…

防御保護15

混合密碼體系 --- 數字信封 邏輯 --- 先用快速的對稱密鑰來對消息進行加密,保證數據的機密性。然后只需要保證對稱密鑰的機密性即可,使用公鑰密鑰體系來對對稱秘鑰消息進行加密。身份認證和數據認證技術 Hash散列 指紋 ---> 單向散列函數 Hash --->…

Linux上管理Java的JDK版本

1.alternatives簡介alternatives是 Linux 系統(尤其是 ??RHEL/CentOS/Fedora?? 等基于 RPM 的發行版)中用于管理??同一軟件多個版本??的系統工具。它通過維護符號鏈接(軟鏈接)的層級結構,幫助用戶在不沖突的情…

webrtc編譯arm/arm64

webrtc版本 m125版本 編譯arm sudo apt install gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf //下載失敗,需要多次嘗試 python3 build/linux/sysroot_scripts/install-sysroot.py --arch=arm //python3 bui

【讀論文】醫療AI大模型:百川開源Baichuan-M2

1. 引言 最新百川開源了一個可以和openai新模型掰手腕的醫療垂直大模型:Baichuan-M2在HealthBench基準上取值60.1的高分,超過了gpt-oss-120b。這次一起回顧下百川給的技術報告。 2. Baichuan-M2概覽:“模型+系統” Baichuan-M2的成功源于一套精心設計的、端到端的訓練與優…

OBOO鷗柏丨75寸/86平板企業辦公會議觸控一體機核心國產化品牌招投標參數

OBOO鷗柏整機參數要求:55寸/65寸/75寸/85-86寸/98寸/100寸/110寸/115寸智能會議平板教學觸控一體機/智慧黑板觸摸屏參數要求。系統可靈活選擇如:支持安卓(Android),Windows可選擇。并在KylinOS銀河麒麟操作系統、統信U…

DCT域信息隱藏中超參數影響的深度解析:從理論到實踐的完整指南

摘要 隨著數字媒體技術的飛速發展,信息隱藏技術在版權保護、內容認證和隱私保護等領域發揮著越來越重要的作用。離散余弦變換(DCT)域作為信息隱藏的經典載體,因其與JPEG壓縮標準的天然兼容性而備受關注。然而,DCT域信息隱藏的效果很大程度上取決于各種超參數的精心調節,…

YOLOv8環境配置命令

【YOLOv8】一小時掌握,從0開始搭建部署YOLOv8系列教程,安裝推理自定義數據集訓練與搭建_嗶哩嗶哩_bilibili【YOLOv8】一小時掌握,從0開始搭建部署YOLOv8系列教程,安裝推理自定義數據集訓練與搭建共計10條視頻,包括&…

Maven私服配置模版

參考課程: 【黑馬程序員 JavaWeb開發教程】 [https://www.bilibili.com/video/BV1m84y1w7Tb] ZZHow(ZZHow1024)Maven 的 settings.xml 配置文件中(從私服下載項目到本地) 在 servers 標簽中,配置訪問私服的個人憑證(訪問的用戶名和…