当前位置: 首页 > 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类的直接交互。

http://www.lryc.cn/news/129262.html

相关文章:

  • 云积天赫|AIGC+营销的排头兵
  • Oracle 数据库备份
  • 【C++】模板template
  • 智能工厂:适应不断变化的制造世界
  • 大数据课程I3——Kafka的消息流与索引机制
  • LVGL学习笔记 28 - 键盘keyboard
  • 【Microsoft 支持】【数据库-MySql】当您尝试从大于 5000 的 TCP 端口连接时收到错误 WSAENOBUFS (10055)
  • 【学会动态规划】最长湍流子数组(23)
  • 【网络编程·网络层】IP协议
  • HTML详解连载(7)
  • 一文打通redis中的String类型
  • 优测云服务平台|【压力测试功能升级】轻松完成压测任务
  • UseEffect中使用setState更新后获取的值为何依然是更新前
  • 去掉鼠标系列之一: 语雀快捷键使用指南
  • 【Linux】Reactor模式
  • 【LeetCode 算法】Merge Two Binary Trees 合并二叉树
  • 系统架构设计师---2017年下午试题1分析与解答(试题五)
  • el-table实现静态和动态合并单元格 以及内容显示的问题
  • STM32F40X系列FSMC8路驱动LCD显示屏(LY-TFT30-39P-1509 芯片hx8352)
  • 小象课堂在线授课教育系统
  • Android 电池容量获取
  • 无涯教程-Perl - tell函数
  • 【论文综述】Transformer 综述
  • 博客摘录「 佛祖保佑,永无bug——springboot启动图案的修改方法」2023年6月8日
  • 【JavaEE进阶】SpringBoot 日志
  • conda - 调研介绍
  • keepalived集群
  • CentOS系统环境搭建(八)——CentOS7开机自动执行脚本(以MySQL为例)
  • re学习(31)BUUCTF-xx(多层加密)
  • HDFS的小文件影响及解决办法