java設計模式之迪米特法則介紹與說明

一、核心概念與目標

  1. 基本定義
    迪米特法則的核心思想是:一個對象應該對其他對象盡可能少地了解,僅與直接關聯的對象(即“朋友”)通信,避免與“陌生人”產生直接交互。
    • 直接朋友:包括當前對象的成員變量、方法參數、方法返回值中的類,以及當前對象創建或聚合的類。
    • 陌生人:方法內部局部變量引用的類,或未通過直接朋友傳遞的類。
  2. 設計目標
    • 降低耦合:減少類之間的直接依賴,避免因某一類的修改引發連鎖反應。
    • 增強封裝性:將復雜邏輯封裝在類內部,僅暴露必要的公共方法。
    • 提高可維護性:通過限制交互范圍,使代碼更易理解和擴展。

二、設計規范與實現策略

  1. 直接通信規則
    • 只允許與直接朋友通信,禁止通過局部變量引入陌生類。例如,在方法內部直接操作其他類的對象(如CollegeEmployee)會違反此原則。
    • 示例修正:若SchoolManager需獲取學院員工信息,應通過CollegeManager的方法間接訪問,而非直接操作CollegeEmployee列表。
  2. 調用轉發機制
    • 通過中間類(如經紀人、外觀類)轉發請求,隱藏底層實現細節。例如,教父通過心腹安排任務,而非直接聯系殺手。
    • 代碼示例:
      // 教父類僅與核心成員通信
      class GodFather {CoreMember coreMember;public void kill(Person someone) {coreMember.kill(someone); // 通過中間類轉發}
      }
      
  3. 封裝與訪問控制
    • 盡量降低類和成員的訪問權限(如使用private),避免暴露內部實現細節。
    • 優先使用組合/聚合而非繼承,減少類間的強依賴。

三、典型應用案例

  1. 學校員工管理系統
    • 問題:SchoolManager直接操作CollegeEmployee,違反迪米特法則。
    • 優化:將CollegeEmployee的邏輯封裝在CollegeManager中,SchoolManager僅通過CollegeManager的公共方法獲取數據。
  2. 訂單與支付系統
    • 問題:Order類直接訪問CustomerAddressCity屬性,形成鏈式調用(customer.address.city.name)。
    • 優化:通過Customer類提供getShippingCity()方法,隱藏內部結構。
  3. 領導與員工協作
    • 問題:Boss直接操作Course列表統計課程數量。
    • 優化:Boss僅與TeamLeader交互,由TeamLeader內部完成統計邏輯。

四、實踐意義與注意事項

  1. 優勢
    • 模塊獨立性:每個類僅關注自身職責,減少外部干擾。
    • 復用性:低耦合設計使類更易在不同場景中復用。
  2. 潛在問題
    • 過度設計:過度使用中間類可能導致代碼冗余,增加理解成本。例如,簡單的數據傳遞無需引入多層封裝。
  3. 與其他原則的協同
    • 依賴倒置原則:通過抽象接口解耦高層與底層模塊。
    • 接口隔離原則:為不同客戶端提供定制化接口,減少不必要的依賴。

五、總結

迪米特法則通過限制對象間的交互范圍,有效降低了系統耦合度,是構建高內聚、低耦合軟件架構的重要工具。實際開發中需結合具體場景靈活應用,避免機械套用導致的過度設計。其核心在于“隱藏細節,只露必要”,從而實現代碼的健壯性與可維護性。

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

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

相關文章

2024-2025華為ICT大賽中國區 實踐賽昇騰AI賽道(高職組)全國總決賽 理論部分真題+解析

Part 1 昇騰AI全棧系統模塊(共6題):1、許多計算芯片可以設計作為人工智能的計算芯片,但不同的芯片計算性能不同,昇騰計算芯片是一種()芯片。(單選題)A.CPU B.GPU C. NPU D.TPU正確答案:C解析:A項CPU中央處理器的架…

網絡安全和基礎設施安全局 (CISA) 表示微分段不再是可選的

網絡安全和基礎設施安全局 (CISA) 最近發布了一系列指導文件中的第一份,旨在幫助聯邦機構實施微分段,作為其零信任架構 (ZTA) 戰略的一部分,以遵守2022 年白宮的授權。 該文件《零信任中的微分段,第一部分:介紹和規劃…

Spring Boot SseEmitter 重復請求問題深度分析與解決方案

1. 前言 在使用 Spring Boot 開發流式接口(Server-Sent Events)時,我們遇到了一個令人困惑的問題:每次 SseEmitter 完成后,都會觸發第二次請求,導致重復請求檢測機制誤報。本文將詳細記錄問題的發現、分析過程以及最終的解決方案。 2. 系統架構背景 2.1 請求處理架構 …

心路歷程-三個了解敲開linux的大門

學習前都愛嘮叨一番: 了解一下:互聯網的發展是離不開服務器的,而服務器的系統主流的還是Linux;這個是有數據進行支撐的;這個只是作為了解而已,我們并不買課,也不做什么買賣的行為,僅…

關于“雙指針法“的總結

筆者這些天終于達成了只狼的全成就,甚是歡喜。然而樂極生悲,最近做了些算法題,竟沒有一道靠自己做出來。感覺算法題常常用到“雙指針法”呢……為什么到現在我還是做不出來這些算法題……今天就來試著總結一下它的使用場景吧。快慢指針法又名…

基于51單片機的智能吊燈

基于 51 單片機的智能吊燈設計與實現論文簡綱一、引言1.1 研究背景與意義闡述傳統照明設備在節能性、智能化方面的不足,結合智能家居產業發展趨勢,說明設計基于 51 單片機的智能吊燈對提升生活便利性、降低能耗的現實意義。1.2 國內外研究現狀簡要介紹當…

CF每日三題(1500-1700)

1792C 逆向思維1036D 前綴和尺取1598D 組合數學取三元組 將二元組放在坐標系中更好找到規律 1792C 思維 1500 參考題解 正難則反 注意是對一個排列進行操作,最后還原成1,2,…,n 每次選兩個數字很難想,反著想就是把1-n的排列變成所給數組的逆操作&#x…

Boost搜索引擎項目(詳細思路版)

目錄 項目相關背景 搜索引擎原理技術棧和項目環境 導入數據到自己的本地 數據去標簽與數據清洗模塊 Enumfile(src_path, &file_list)遞歸式寫入 Parsehtml(file_list, &results)去標簽 bool Parsetitle(const string& file, string* title)拆分標題 bool Pa…

AI產品經理面試寶典第69天:大模型穩定性評估與AI倫理挑戰面試題全解析

1. AI倫理與技術挑戰 1.1 問:你認為AI的最大挑戰是什么? 答:AI面臨的最大挑戰是算法偏見與模型黑箱問題。具體表現為: 數據偏見放大:訓練數據中隱含的性別、種族等偏見會被模型繼承,如招聘算法中的性別歧視案例 決策透明性缺失:深度學習模型的可解釋性不足,醫療診斷場…

【build】RDK構建系統v0.1 (持續更新。。。。)

一、 項目概述RDK構建系統是一個用于構建和定制嵌入式系統的自動化工具,通過簡單的命令行操作,您可以完成從下載依賴包、定制根文件系統、構建內核到打包鏡像的完整流程。該系統采用模塊化設計,提供了豐富的配置選項,適用于不同的…

關于RSA和AES加密

RSA非對稱加密 非對稱加密不能傳輸大數據量,但比對稱加密要安全,所以傳輸密碼一般就是用的非對稱加密 接口拿到RSA公鑰然后再加密之后傳給后端就好了 let crypt new JSEncrypt(); crypt.setPublicKey(res.message); // console.log(加密前:, data); let…

云蝠智能VoiceAgent:AI賦能售后服務場景的創新實踐

引言:售后服務數字化轉型的必然趨勢在數字經濟時代,售后服務已成為企業核心競爭力的重要組成部分。據統計,優質的售后服務能夠提升客戶留存率高達67%,同時降低客戶獲取成本約30%。然而,傳統售后服務模式面臨著人力成本…

C#控制臺輸入(Read()、ReadKey()和ReadLine())

下面我們來詳細講解 C# 中三種控制臺輸入方法:Console.Read()、Console.ReadKey() 和 Console.ReadLine() 的區別、原理、使用場景,并配上清晰的代碼例子和運行結果說明。? 一、三者的根本區別(一句話總結)方法返回值讀取方式是否…

Windows的Roaming文件夾的作用和Local/LocalLow的區別

📁 Roaming 文件夾的核心意義? 什么是“漫游”(Roaming)?跨設備同步:當用戶登錄到同一域內的不同 Windows 設備(如公司或學校的辦公電腦)時,Roaming 文件夾中的數據會自動通過網絡同…

【Java Web 快速入門】十一、Spring Boot 原理

目錄Spring Boot 原理配置優先級Bean 管理獲取 BeanBean 的作用域第三方 BeanSpring Boot 底層原理起步依賴自動配置核心原理實例說明例 1:自定義一個 “日志 starter”例 2:SpringBoot 自帶的 spring-boot-starter-web關鍵總結Spring Boot 原理 配置優…

基于Redisson的分布式鎖原理深度解析與優化實踐

基于Redisson的分布式鎖原理深度解析與優化實踐 分布式環境下,鎖的實現至關重要。本文將從技術背景與應用場景出發,結合核心原理、關鍵源碼、實際示例,深入剖析Redisson分布式鎖的實現機制,并給出性能優化建議,幫助后端…

室外 3DVG 基準

室外 3DVG基準(按重要性與被引用頻率) Talk2Car / Talk2Car-3D (2019 / 衍生) — 對象 referral(駕駛場景) 說明:最早的自然語言 → 駕駛場景對象引用數據集之一(原 Talk2Car 是以 nuScenes 為底并提供自然…

Jenkins安裝部署(Win11)和常見配置鏡像加速

一、安裝前準備 本文使用的Jenkins Windows一鍵安裝包,JDK事先配置好環境變量,Jenkins版本: Jenkins下載地址:jenkins一鍵安裝包v2-479-1.msi資源-CSDN下載 二、Jenkins安裝部署 1、下載Jenkins ,點擊下一步下一步…

Windows MCP.Net:革命性的 .NET Windows 桌面自動化 MCP 服務器

📋 目錄 項目概述 核心技術架構 功能特性詳解 技術實現亮點 安裝與配置 實戰應用場景 代碼示例與API詳解 性能優化與最佳實踐 未來發展規劃 總結 項目概述 在人工智能快速發展的今天,AI 助手與操作系統的深度集成成為了一個重要趨勢。Window…

Java ArrayList的介紹及用法

十分想念順店雜可。。。ArrayList 是 Java 集合框架中最常用的類之一,實現了 List 接口,底層基于動態數組實現,支持動態擴容,相比普通數組更靈活。以下是其詳細介紹及用法:一、核心特性動態大小:無需預先指…