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

相关文章:

  • 企业视频数字人有哪些应用场景
  • LoRa模块空中唤醒功能原理和物联网应用
  • spring中的DI
  • gpt-4-vision-preview 识图
  • Spring Framework 6.1 正式发布
  • SystemVerilog学习 (11)——覆盖率
  • jQuery,解决命名冲突的问题
  • 为什么C++标准库中atomic shared_ptr不是lockfree实现?
  • Python基础入门例程58-NP58 找到HR(循环语句)
  • 航天联志Aisino-AISINO26081R服务器通过调BIOS用U盘重新做系统(windows系统通用)
  • windows 10 更新永久关闭
  • 循环优先级仲裁~位屏蔽仲裁算法
  • 千年版本修改小技巧
  • 教学过程中可以实施哪些考核评价方式?
  • MyBatis查询数据库(全是精髓)
  • elementPlus+vue3引入icon图标
  • Spring框架中的bean管理(XML和注解及属性的注入)
  • MySQL 存储过程提高数据库效率和可维护性
  • JAXB的XmlElement注解
  • 竞赛选题 深度学习驾驶行为状态检测系统(疲劳 抽烟 喝水 玩手机) - opencv python
  • 59 权限提升-Win溢出漏洞及ATSCPS提权
  • 【新闻稿】Solv 与 zCloak 联合开发跨境贸易场景下可编程数字凭证项目,获得新加坡、加纳两国央行支持...
  • requests库进行爬虫ip请求时遇到的错误解决方法
  • 目标检测—YOLO系列(二 ) 全面解读论文与复现代码YOLOv1 PyTorch
  • Redis维护缓存的方案选择
  • LeetCode236. Lowest Common Ancestor of a Binary Tree
  • 基于Gin+Gorm框架搭建MVC模式的Go语言企业级后端系统
  • 【开源】基于Vue和SpringBoot的固始鹅块销售系统
  • Windows11怎样投屏到电视上?
  • ubuntu中用docker部署jenkins,并和码云实现自动化部署