当前位置: 首页 > 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…...

告别虚拟机卡顿:在 Windows WSL2 的 Kali 子系统中配置 Pwn 调试环境

告别虚拟机卡顿&#xff1a;在 Windows WSL2 的 Kali 子系统中配置 Pwn 调试环境 对于安全研究人员和 CTF 爱好者来说&#xff0c;Kali Linux 是必不可少的工具集。然而&#xff0c;传统的虚拟机方案常常面临性能瓶颈——内存占用高、启动速度慢、与主机系统交互不便。WSL2 的出…...

Claude集成OpenClaw:多智能体框架的模型驱动开发实践

1. 项目概述&#xff1a;当Claude遇上OpenClaw&#xff0c;一个智能体协作框架的诞生最近在AI智能体开发圈里&#xff0c;一个名为“gungwang/claude-into-openclaw”的项目引起了我的注意。乍一看这个标题&#xff0c;你可能会有点懵——“Claude”是Anthropic家的那个大语言模…...

Midjourney提示词工程实战手册(工业级Prompt架构白皮书):从语义解析、权重分配到多模态对齐的完整链路

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Midjourney提示词工程的核心范式与工业级演进路径 提示词工程已从早期的“关键词堆砌”跃迁为融合语义建模、风格解耦与可控生成的系统性工程。在工业级实践中&#xff0c;其核心范式正围绕**结构化提示…...

基于RT-Thread与STM32的物联网桌面天气时钟开发实战

1. 项目概述&#xff1a;一个嵌入式工程师的桌面小确幸几年前&#xff0c;我在工位上放了一个从网上淘来的电子时钟&#xff0c;功能很简单&#xff0c;就是显示时间。后来觉得光看时间有点单调&#xff0c;就想&#xff0c;能不能自己动手做一个既能显示时间日期&#xff0c;又…...

基于RAG与向量数据库的智能代码搜索工具设计与实现

1. 项目概述&#xff1a;一个面向开发者的智能代码搜索与理解工具 最近在GitHub上看到一个挺有意思的项目&#xff0c;叫 holasoymalva/perplexity-code 。乍一看这个标题&#xff0c;可能会有点困惑——“perplexity”在机器学习里通常指“困惑度”&#xff0c;是衡量语言模…...

churrera-cli:Go语言开发的Git仓库批量克隆与自动化管理工具

1. 项目概述&#xff1a;一个为开发者“挤奶油”的命令行工具如果你是一名经常与GitHub、GitLab等代码托管平台打交道的开发者&#xff0c;那么你一定对“克隆仓库”这个动作再熟悉不过了。每天&#xff0c;我们可能都需要从不同的地方拉取代码库&#xff0c;无论是为了学习、复…...

OrangePi串口实战:从pyserial配置到USB-TTL数据抓取

1. 环境准备与硬件连接 第一次玩OrangePi串口通信时&#xff0c;我对着桌上那堆USB-TTL模块和杜邦线发呆了半小时。后来才发现&#xff0c;硬件连接其实比想象中简单。你需要准备三样东西&#xff1a;OrangePi开发板&#xff08;我用的是OrangePi 5&#xff09;、USB-TTL转换模…...

在 Taotoken 上观测多模型 API 调用用量与成本明细

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 在 Taotoken 上观测多模型 API 调用用量与成本明细 对于使用多个大模型 API 的开发者而言&#xff0c;清晰、透明地掌握调用情况和…...

开源AI应用构建平台Casibase:从架构设计到生产部署全解析

1. 项目概述&#xff1a;一个开源的AI应用构建平台最近在折腾AI应用开发的朋友&#xff0c;估计都绕不开一个核心痛点&#xff1a;想法很多&#xff0c;但落地太难。从模型选型、API对接、到前端交互、数据管理&#xff0c;每一个环节都够喝一壶。特别是当你想把多个模型、多种…...

WinRAR隐藏技能:除了.rar和.zip,批处理还能压成啥?附参数避坑指南

WinRAR命令行进阶指南&#xff1a;解锁隐藏压缩格式与参数避坑实战 在大多数用户的认知里&#xff0c;WinRAR只是个能处理.rar和.zip文件的图形化工具。但它的命令行版本却隐藏着一个完全不同的世界——支持超过20种压缩格式转换、批量自动化处理、甚至能实现文件系统级操作。本…...