当前位置: 首页 > news >正文

【喵叔闲扯】--迪米特法则

迪米特法则,也称为最少知识原则(Law of Demeter),是面向对象设计中的一个原则,旨在降低对象之间的耦合性,提高系统的可维护性和可扩展性。该原则强调一个类不应该直接与其它不相关的类相互交互,而是通过少数几个密切相关的类来进行通信。这有助于减少类之间的依赖关系,降低代码的耦合性,使得系统更加灵活和易于维护。
迪米特法则的核心思想可以概括为以下几点:

  1. 一个对象应该尽量少地了解其他对象的内部结构和实现。

  2. 一个对象只与其直接朋友(即与其关联最密切的对象)进行交互。

  3. 避免在一个类中引入不必要的依赖关系,尽量保持类之间的解耦。

以下是一个示例代码来说明迪米特法则:
假设我们有一个电商系统,包含了顾客(Customer)、订单(Order)和商品(Product)这三个类。

class Product {private String name;private double price;public Product(String name, double price) {this.name = name;this.price = price;}public double getPrice() {return price;}
}class Order {private List<Product> products = new ArrayList<>();public void addProduct(Product product) {products.add(product);}public double calculateTotalPrice() {double totalPrice = 0;for (Product product : products) {totalPrice += product.getPrice();}return totalPrice;}
}class Customer {private List<Order> orders = new ArrayList<>();public void addOrder(Order order) {orders.add(order);}public void printTotalSpent() {double totalSpent = 0;for (Order order : orders) {totalSpent += order.calculateTotalPrice();}System.out.println("Total amount spent: " + totalSpent);}
}

在这个示例中,迪米特法则的考虑并不充分。例如,在Customer类的printTotalSpent方法中,我们直接访问了Order类的内部结构和Product类的内部结构。这会导致Customer类与Order类和Product类之间存在紧耦合的关系,违反了迪米特法则。

符合迪米特法则的改进示例:

class Product {private String name;private double price;public Product(String name, double price) {this.name = name;this.price = price;}public double getPrice() {return price;}
}class Order {private List<Product> products = new ArrayList<>();public void addProduct(Product product) {products.add(product);}public double calculateTotalPrice() {double totalPrice = 0;for (Product product : products) {totalPrice += product.getPrice();}return totalPrice;}
}class Customer {private List<Order> orders = new ArrayList<>();public void addOrder(Order order) {orders.add(order);}public double calculateTotalSpent() {double totalSpent = 0;for (Order order : orders) {totalSpent += order.calculateTotalPrice();}return totalSpent;}
}class ShoppingCart {private List<Product> products = new ArrayList<>();public void addProduct(Product product) {products.add(product);}public double calculateTotalPrice() {double totalPrice = 0;for (Product product : products) {totalPrice += product.getPrice();}return totalPrice;}
}

在改进后的示例中,Customer类不再直接与Order类和Product类的内部结构交互,而是通过添加一个calculateTotalSpent方法来计算总花费。同时,引入了ShoppingCart类来管理购物车中的商品,避免了Customer类与Product类的直接交互。

相关文章:

【喵叔闲扯】--迪米特法则

迪米特法则&#xff0c;也称为最少知识原则&#xff08;Law of Demeter&#xff09;&#xff0c;是面向对象设计中的一个原则&#xff0c;旨在降低对象之间的耦合性&#xff0c;提高系统的可维护性和可扩展性。该原则强调一个类不应该直接与其它不相关的类相互交互&#xff0c;…...

企业视频数字人有哪些应用场景

来做个数字人吧&#xff0c;帮我干点活吧。 国内的一些数字人&#xff1a; 腾讯智影 腾讯智影数字人是一种基于人工智能技术的数字人物形象&#xff0c;具有逼真的外观、语音和行为表现&#xff0c;可以应用于各种场景&#xff0c;如新闻播报、文娱推介、营销、教育等。 幻…...

LoRa模块空中唤醒功能原理和物联网应用

LoRa模块是一种广泛应用于物联网领域的无线通信模块&#xff0c;支持低功耗、远距离和低成本的无线通信。 其空中唤醒功能是一项重要的应用&#xff0c;可以实现设备的自动唤醒&#xff0c;从而在没有人工干预的情况下实现设备的远程监控和控制。 LoRa模块空中唤醒功能的原理…...

spring中的DI

【知识要点】 控制反转&#xff08;IOC&#xff09;将对象的创建权限交给第三方模块完成&#xff0c;第三方模块需要将创建好的对象&#xff0c;以某种合适的方式交给引用对象去使用&#xff0c;这个过程称为依赖注入&#xff08;DI&#xff09;。如&#xff1a;A对象如果需要…...

gpt-4-vision-preview 识图

这些图片都是流行动画角色的插图。 第一张图片中的角色是一块穿着棕色方形裤子、红领带和白色衬衫的海绵&#xff0c;它站立着并露出开心的笑容。该角色在一个蓝色的背景前&#xff0c;显得非常兴奋和活泼。 第二张图片展示的是一只灰色的小老鼠&#xff0c;表情开心&#xf…...

Spring Framework 6.1 正式发布

Spring Framework 6.1.0 现已从 Maven Central 正式发布&#xff01;6.1 一代有几个关键主题&#xff1a; 拥抱 JDK 21 LTS虚拟线程&#xff08;Project Loom&#xff09;JVM 检查点恢复&#xff08;项目 CRaC&#xff09;重新审视资源生命周期管理重新审视数据绑定和验证新的…...

SystemVerilog学习 (11)——覆盖率

目录 一、概述 二、覆盖率的种类 1、概述 2、分类 三、代码覆盖率 四、功能覆盖率 五、从功能描述到覆盖率 一、概述 “验证如果没有量化&#xff0c;那么就意味着没有尽头。” 伴随着复杂SoC系统的验证难度系数成倍增加&#xff0c;无论是定向测试还是随机测试&#xff…...

jQuery,解决命名冲突的问题

使用noConflict(true)&#xff0c;把$和jQuery名字都给别人 <body><script>var $ zanvar jQuery lan</script><script src"./jquery.js"></script><script>console.log(jQuery, 11111); // 打印jquery函数console.log($, 222…...

为什么C++标准库中atomic shared_ptr不是lockfree实现?

为什么C标准库中atomic shared_ptr不是lockfree实现&#xff1f; 把 shared_ptr 做成 lock_free&#xff0c;应该是没有技术上的可行性。shared_ptr 比一个指针要大不少&#xff1a;最近很多小伙伴找我&#xff0c;说想要一些C的资料&#xff0c;然后我根据自己从业十年经验&am…...

Python基础入门例程58-NP58 找到HR(循环语句)

最近的博文: Python基础入门例程57-NP57 格式化清单(循环语句)-CSDN博客 Python基础入门例程56-NP56 列表解析(循环语句)-CSDN博客 Python基础入门例程55-NP55 2的次方数(循环语句)-CSDN博客 目录 最近的博文: 描述...

航天联志Aisino-AISINO26081R服务器通过调BIOS用U盘重新做系统(windows系统通用)

产品名称:航天联志Aisino系列服务器 产品型号:AISINO26081R CPU架构&#xff1a;Intel 的CPU&#xff0c;所以支持Windows Server all 和Linux系统&#xff08;重装完系统可以用某60驱动管家更新所有硬件驱动&#xff09; 操作系统&#xff1a;本次我安装的服务器系统为Serv…...

windows 10 更新永久关闭

1 winR 输入&#xff1a;services.msc 编辑&#xff1a; 关闭&#xff1a;...

循环优先级仲裁~位屏蔽仲裁算法

参考了FPGA奇哥&#xff08;下列视频中UP主&#xff09;的讲解。 应该可以对多路读写DDR3进行操作&#xff0c;仅仲裁&#xff0c;不涉及DMA和Uibuf等。 2023年11月所写&#xff0c;暂未进行测试&#xff0c;日后补上。 第二天已完成测试&#xff0c;功能可行。 深入FPGA底层…...

千年版本修改小技巧

千年门派创建后消失的原因 门派在游戏里创建后重启服务器消失其实就差一个单词name&#xff0c;只要将这个单词加在 guild文件夹里的 createguild.sdb文件里的第一行第一个就可以。可以先将createguild.sdb的内容清空 然后复制以下内容到 createguild.sdb 最后保存下就可以了n…...

教学过程中可以实施哪些考核评价方式?

教学过程中可以实施哪些考核评价方式&#xff1f; 实践技能与理论知识考试结合&#xff1a;旨在综合考察学生对理论知识的掌握程度及其在实践中的运用能力。 模拟仿真与现场考试结合&#xff1a;通过模拟真实场景或者实际操作环境&#xff0c;考察学生在实际情境中解决问题的能…...

MyBatis查询数据库(全是精髓)

1. 什么是MyBatis&#xff1f; 简单说&#xff0c;MyBatis就是一个完成程序与数据库交互的工具&#xff0c;也就是更简单的操作和读取数据库的工具。 2. 怎么学习Mybatis Mybatis学习只分为两部分&#xff1a; 配置MyBatis开发环境使用MyBatis模式和语法操作数据库 3. 第一…...

elementPlus+vue3引入icon图标

安装包管理&#xff0c;推荐使用 yarn npm包有时候会有包冲突&#xff0c;在项目的根目录下执行&#xff0c;在终端下 # Yarn $ yarn add element-plus/icons-vue在main.js或main.ts中进行全局注册&#xff0c;导入所有图标 import * as ElementPlusIconsVue from element-plu…...

Spring框架中的bean管理(XML和注解及属性的注入)

Spring框架中IOC就是将创建对象的权力反转给Spring框架&#xff0c;我们无需自己创建对象&#xff0c;直接在Spring框架的容器中获取即可。 bean中配置的就是需要让Spring管理的类。 XML的bean管理 先写个“HelloWorld”: <bean id"User" class"com.ffyc.…...

MySQL 存储过程提高数据库效率和可维护性

MySQL 存储过程是一种强大的数据库功能&#xff0c;它允许你在数据库中存储和执行一组SQL语句&#xff0c;类似于编程中的函数。存储过程可以大幅提高数据库的性能、安全性和可维护性。本文将详细介绍MySQL存储过程的使用。 什么是MySQL存储过程&#xff1f; MySQL存储过程是一…...

JAXB的XmlElement注解

依赖 如果基于JAX-WS开发&#xff0c;可以在maven工程的pom.xml文件中增加如下依赖&#xff0c;会将依赖的JAXB库也下载下来&#xff1a; <dependency><groupId>jakarta.xml.ws</groupId><artifactId>jakarta.xml.ws-api</artifactId><vers…...

基于AkShare构建A股基础数据自动化采集方案

1. 为什么需要自动化采集A股基础数据 做量化研究的朋友都知道&#xff0c;获取准确、完整的股票基础数据是策略开发的基石。我刚开始做量化时&#xff0c;最头疼的就是每次跑策略前都要手动更新股票列表&#xff0c;经常因为数据不全导致回测结果失真。后来发现AkShare这个宝藏…...

【昇腾实战】MindIE框架下DeepSeek-R1模型部署与性能调优指南

1. 昇腾环境准备与驱动安装 拿到昇腾服务器后&#xff0c;第一件事就是搭建基础运行环境。我遇到过不少开发者卡在驱动安装环节&#xff0c;其实只要注意几个关键点就能避坑。首先到华为昇腾官网下载对应版本的驱动和固件包&#xff0c;这里有个细节&#xff1a;一定要核对服务…...

STM32状态机按键驱动设计:支持多事件触发与动态配置

1. 为什么需要状态机按键驱动&#xff1f; 在嵌入式开发中&#xff0c;按键处理看似简单却暗藏玄机。传统while循环扫描方式就像让主程序不断询问"按键按下了吗&#xff1f;"&#xff0c;不仅效率低下&#xff0c;还会导致系统响应迟钝。我曾在一个工业控制器项目中发…...

解码器精准调优:LoRA赋能Depth-Anything-V2实现绝对深度估计

1. LoRA技术如何革新Depth-Anything-V2的深度估计 当我在实验室第一次尝试用LoRA微调Depth-Anything-V2时&#xff0c;意外发现只需要调整解码器中1x1卷积层的极少量参数&#xff0c;就能让相对深度模型输出精确的绝对深度值。这就像给一个只会判断"远近"的模型突然装…...

突破工厂建设瓶颈:FactoryBluePrints蓝图库带来的自动化生产革命

突破工厂建设瓶颈&#xff1a;FactoryBluePrints蓝图库带来的自动化生产革命 【免费下载链接】FactoryBluePrints 游戏戴森球计划的**工厂**蓝图仓库 项目地址: https://gitcode.com/GitHub_Trending/fa/FactoryBluePrints FactoryBluePrints是戴森球计划的开源工厂蓝图…...

Arctic数据压缩与序列化:LZ4压缩如何提升性能10倍的终极指南

Arctic数据压缩与序列化&#xff1a;LZ4压缩如何提升性能10倍的终极指南 【免费下载链接】arctic High performance datastore for time series and tick data 项目地址: https://gitcode.com/gh_mirrors/ar/arctic Arctic是一个专为时间序列和tick数据设计的高性能数据…...

基于Spark+Hadoop+Hive 深度学习大数据的运河航运效率提升平台的设计与实现

前言随着全球贸易的不断发展&#xff0c;运河航运作为连接内陆与海洋的重要交通方式&#xff0c;其运输效率的提升对于促进经济发展、优化资源配置具有重要意义。基于大数据的运河航运效率提升平台的设计与实现&#xff0c;旨在通过收集、处理和分析大量的航运数据&#xff0c;…...

pvr.iptvsimple技术解构:IPTV直播系统构建的底层逻辑与实践指南

pvr.iptvsimple技术解构&#xff1a;IPTV直播系统构建的底层逻辑与实践指南 【免费下载链接】pvr.iptvsimple IPTV Simple client for Kodi PVR 项目地址: https://gitcode.com/gh_mirrors/pv/pvr.iptvsimple 问题定位&#xff1a;IPTV直播系统的技术痛点与架构挑战 IP…...

ComfyUI翻译节点终极指南:如何选择最适合你的AI创作翻译工具

ComfyUI翻译节点终极指南&#xff1a;如何选择最适合你的AI创作翻译工具 【免费下载链接】ComfyUI_Custom_Nodes_AlekPet Custom nodes that extend the capabilities of Comfyui 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI_Custom_Nodes_AlekPet 在AI图像生…...

通义千问1.5-1.8B-Chat-GPTQ-Int4场景应用:网络安全威胁情报的智能分析与报告生成

通义千问1.5-1.8B-Chat-GPTQ-Int4场景应用&#xff1a;网络安全威胁情报的智能分析与报告生成 1. 引言&#xff1a;当安全分析师遇上信息洪流 想象一下&#xff0c;你是一名网络安全分析师。凌晨三点&#xff0c;刺耳的告警声把你从睡梦中惊醒。屏幕上&#xff0c;来自防火墙…...