【设计模式-迪米特法则】

迪米特法则(Law of Demeter,LoD),也称为最少知识原则(Principle of Least Knowledge),是一种面向对象编程中的设计原则。它的核心思想是:一个对象应当尽可能少地了解其他对象,即只与直接相关的对象通信,而不要过度依赖外部对象的内部细节。通过减少对象之间的耦合度,提升代码的可维护性、可扩展性以及模块化程度。

1. 迪米特法则的定义

迪米特法则的定义可以简单概括为:

  • 不要与陌生人说话:一个对象不应当调用其他对象的内部方法(除了其直接依赖的对象)。
  • 对象只与其直接关联的对象交互,避免与依赖链上的其他对象产生直接通信。

2. 具体规则

根据迪米特法则,一个对象的方法只能调用以下几类对象的方法:

  • 自身对象:即当前对象的方法。
  • 其成员对象:对象的成员变量、属性(包括集合中的元素)。
  • 方法参数:当前方法中传入的参数对象。
  • 方法创建的局部对象:当前方法中创建的局部变量对象。
  • 全局变量(如果存在)。

这个原则的目的是减少不同类之间的耦合,使得一个模块或类不需要过多地了解另一个模块的内部实现,进而降低系统中各个模块之间的依赖性。

3. 迪米特法则的目的

  • 降低耦合:迪米特法则通过减少对象之间的相互依赖,避免由于一个类的修改而影响到其他类,增强系统的灵活性和可维护性。
  • 提高内聚性:遵守迪米特法则,可以使类的职责更加明确,每个类只处理自己的相关操作,增强类的内聚性。
  • 增强可读性:减少类与类之间的直接通信后,代码的整体结构更加清晰,使得代码的可读性和可理解性提高。

4. 违反迪米特法则的典型例子

迪米特法则建议避免“链式调用”或过度深入依赖对象的内部结构。假设有一个汽车类和发动机类的设计,以下是一个违反迪米特法则的示例:

class Engine {public String getFuelType() {return "Gasoline";}
}class Car {private Engine engine = new Engine();public Engine getEngine() {return engine;}
}public class Main {public static void main(String[] args) {Car car = new Car();// 通过Car对象获取Engine对象,并进一步调用Engine的getFuelType()方法String fuelType = car.getEngine().getFuelType();System.out.println("Fuel type: " + fuelType);}
}
违背迪米特法则的地方:

在上面的代码中,Main 类不仅与 Car 类产生了依赖,还与 Engine 类产生了依赖。这意味着如果 Engine 类的实现发生变化,Main 类也可能需要修改。这种情况增加了类之间的耦合性,违背了迪米特法则。

5. 符合迪米特法则的设计

为了遵守迪米特法则,Car 类应该封装其内部的 Engine 细节,只提供获取燃料类型的方法,而不暴露 Engine 对象的内部结构:

class Engine {public String getFuelType() {return "Gasoline";}
}class Car {private Engine engine = new Engine();// 提供获取燃料类型的方法,而不是暴露Engine对象public String getFuelType() {return engine.getFuelType();}
}public class Main {public static void main(String[] args) {Car car = new Car();// 直接通过Car对象获取燃料类型,不需要访问Engine对象String fuelType = car.getFuelType();System.out.println("Fuel type: " + fuelType);}
}
改进的设计:
  • Main 类现在只和 Car 类打交道,并不需要了解 Engine 类的存在。这减少了类之间的耦合度,符合迪米特法则的要求。
  • Car 类承担了管理 Engine 类的责任,封装了获取 Engine 的内部逻辑,外部不需要关心 Engine 的具体实现。

6. 迪米特法则的好处

  • 提高模块独立性:每个模块或类的实现细节不直接暴露给其他模块,因此更容易进行独立开发和测试。
  • 减少修改的影响范围:当一个类的实现细节发生变化时,由于其他类不依赖于这些细节,因此不需要修改其他类的代码。
  • 增强代码的可维护性:对象之间的依赖关系少了,修改某个对象时,不会影响到太多的其他对象,从而提高了系统的可维护性。

7. 迪米特法则的应用场景

迪米特法则在以下场景中非常适用:

  • 大型复杂系统:在设计大型复杂系统时,减少对象之间的耦合可以避免系统结构的混乱,增强系统的可扩展性。
  • 面向对象设计中:在进行面向对象编程时,迪米特法则是一项重要的设计原则,帮助开发者避免创建过于复杂的依赖关系。
  • 模块化开发:模块之间的通信应尽量简单,避免过度依赖其他模块的细节,保持各个模块的独立性。

8. 迪米特法则的缺点

虽然迪米特法则有诸多优点,但在某些情况下也可能带来一些问题:

  • 过度封装:为了严格遵守迪米特法则,开发者可能会过度封装一些细节,导致代码复杂性增加,增加类的职责,从而违背单一职责原则。
  • 性能问题:在某些场景中,为了隐藏内部结构和减少直接依赖,可能引入额外的方法调用,导致系统性能下降。

9. 总结

迪米特法则强调降低对象之间的耦合,通过减少类之间的直接依赖,提升代码的可维护性、可扩展性以及可复用性。在实践中,遵守迪米特法则有助于设计高内聚、低耦合的系统,使得系统中的各个模块更加独立、灵活。然而,迪米特法则并不是绝对的,开发者在应用时应当权衡封装与性能、复杂度之间的关系,避免过度封装导致代码臃肿或职责不清。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/19696.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

「二」体验HarmonyOS端云一体化开发模板——创建端云一体化工程

关于作者 白晓明 宁夏图尔科技有限公司董事长兼CEO、坚果派联合创始人 华为HDE、润和软件HiHope社区专家、鸿蒙KOL、仓颉KOL 华为开发者学堂/51CTO学堂/CSDN学堂认证讲师 开放原子开源基金会2023开源贡献之星 「目录」 「一」HarmonyOS端云一体化概要 「二」体验HarmonyOS端云一…

操作系统启动实验

简单的操作系统 汇编代码 ; hello-os ; TAB4ORG 0x7c00 ; 指明程序装载地址; 标准FAT12格式软盘专用的代码 Stand FAT12 format floppy codeJMP entryDB 0x90DB "HELLOIPL" ; 启动扇区名称(8字节)DW 512 ; 每个扇区(s…

助力模型训练,深度学习的经典数据集介绍

想要训练出效果好的模型,高质量的数据集必不可少。深度学习的经典数据集包括MNIST手写数字数据集、Fashion MNIST数据集、CIFAR-10和CIFAR-100数据集、ILSVRC竞赛的ImageNet数据集、用于检测和分割的PASCAL VOC和COCO数据集等,本文将对这些数据集进行介绍…

Spring基础——针对实习面试

目录 Spring基础什么是Spring框架?列举一些重要的Spring模块Spring Core 核心模块Spring AOP 模块Spring MVC 模块Spring Data 模块Spring Security 模块Spring Boot 模块 Spring,Spring MVC,Spring Boot之间什么关系(区别&#x…

PH热榜 | 2024-11-17

DevNow 是一个精简的开源技术博客项目模版,支持 Vercel 一键部署,支持评论、搜索等功能,欢迎大家体验。 在线预览 1. Octokit 标语:人人都能用的无代码游戏和AR滤镜制作工具 介绍:Octokit 是一款无需编程技能就能使用…

分享本周所学——三维重建算法3D Gaussian Splatting(3DGS)

大家好,欢迎来到《分享本周所学》第十二期。本人是一名人工智能初学者,刚刚读完大二。前几天自学了一下3D Gaussian Splatting(3DGS),觉得非常有意思。写这篇文章主要是因为网上大部分关于3DGS的文章都比较晦涩&#x…

Python-简单病毒程序合集(一)

前言:简单又有趣的Python恶搞代码,往往能给我们枯燥无味的生活带来一点乐趣,激发我们对编程的最原始的热爱。那么话不多说,我们直接开始今天的编程之路。 编程思路:本次我们将会用到os,paltform,threading,ctypes,sys,…

技术成长战略是什么?

文章目录 技术成长战略是什么?1. 前言2. 跟技术大牛学成长战略2.1 系统性能专家案例2.2 从开源到企业案例2.3 技术媒体大V案例2.4 案例小结 3. 学习金字塔和刻意训练4. 战略思维的诞生5. 建议 技术成长战略是什么? 1. 前言 在波波的微信技术交流群里头…

哪家云电脑便宜又好用?ToDesk云电脑、顺网云、达龙云全方位评测

陈老老老板🤴 🧙‍♂️本文专栏:生活(主要讲一下自己生活相关的内容)生活就像海洋,只有意志坚强的人,才能到达彼岸。 🧙‍♂️本文简述:讲一下市面上云电脑的对比。 🧙‍♂️上一篇文…

(五)自定义组件

(五)自定义组件 1、 VS插件推荐2、开始创建自定义的组件2.1、 快速添加基础页面内容: vbase2.2、 随便写上内容 3、使用该组件3.1、具体步骤3.2、其他说明 1、 VS插件推荐 开始前,如果大家使用的是VS Code,我推荐安装Vue VSCode S…

Springboot+Vue的项目搭建(一)

一、JDK配置环境变量 1、在官网下载jdkJava Downloads | Oracle 中国 2、下载之后双击安装。 3、配置环境变量,做法:此电脑->右键->属性->高级系统设置 然后点击确定即可 点击winr java -version 检查一下是否配置成功 二、maven包管理器…

如何从微软官网下载运行库解决?微软官网教你如何获取最新运行库支持

当您在运行某些应用程序或游戏时遇到缺少运行库文件的问题,例如“unityplayer.dll文件丢失”,访问微软官方网站下载并安装最新的运行库是一个可靠且安全的解决方案。微软提供的运行库包含了多种语言环境下的库文件和支持,如Visual C Redistri…

tdengine学习笔记-整体架构及docker安装

官方文档:用 Docker 快速体验 TDengine | TDengine 文档 | 涛思数据 整体架构 TDENGINE是分布式,高可靠,支持水平扩展的架构设计 TDengine分布式架构的逻辑结构图如下 一个完整的 TDengine 系统是运行在一到多个物理节点上的,包含…

多线程——单例模式

目录 前言 一、设计模式 二、饿汉模式 三、懒汉模式 1.单线程版 2.多线程版 结尾 前言 前面的几篇文章中介绍了多线程编程的基础知识,在本篇文章开始,就会利用前面的多线程编程知识来编写一些代码案例,从而使大家可以更好的理解运用多…

关于Web Component

2024年8月14日 引言 Web Component 是一种用于构建可复用用户界面组件的技术,开发者可以创建自定义的 HTML 标签,并将其封装为包含逻辑和样式的独立组件,从而在任何 Web 应用中重复使用,并且可以做到无框架跨框架。 不同于 Vue…

【进阶系列】python的模块

模块 创建一个 .py 文件,这个文件就称之为 一个模块 Module 如何使用 import 想要B.py文件中,使用A.py文件,只需要在B.py文件中使用关键字import导入即可。 import A# 若A是一个包的话,可以这样写 import A.函数名from impor…

全志T113双核异构处理器的使用基于Tina Linux5.0——RTOS编译开发说明

3、RTOS编译开发说明 3.1、RTOS SDK与TinaLinux开发环境 RTOS SDK相关代码已集成到Tina Linux开发环境,Tina Linux开发环境下的rtos子目录即为RTOS开发环境。 ├──brandy ├──bsp ├──build ├──buildroot ├──build.sh >build/top_build.sh ├──…

十六.SpringCloudAlibaba极简入门-整合Grpc代替OpenFeign

前言 他来了他来了,停了快2个月了终于又开始更新文章啦,这次带来的绝对是干货!!!。由于公司项目进行重构的时候考虑到,OpenFeign做为服务通信组件在高并发情况下有一定的性能瓶颈,所以将其替换…

【Linux】环境变量详解

Linux环境变量 1.环境变量分类2.环境变量相关指令3.常用的环境变量4.环境变量的组织方式5.获取环境变量6.命令行参数 1.环境变量分类 按生命周期划分: 永久的:在环境变量脚本文件中配置,用户每次登录时会自动执行这些脚本,相当于永…

SpringBoot项目搭建IEDA2023.1.2

导入依赖 ——————————————————