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

相关文章:

  • 23111708[含文档+PPT+源码等]计算机毕业设计基于javaweb的旅游网站前台与后台旅景点
  • 元宇宙3D云展厅应用到汽车销售的方案及特点
  • DAO和增删改查通用方法-BasicDao
  • PON网络应用场景
  • Jupyter Notebook的下载安装与使用教程_Python数据分析与可视化
  • 一文看分布式锁
  • Node.js中的Buffer和Stream
  • CTF-PWN-堆- 【off-by-one】
  • 「Verilog学习笔记」实现3-8译码器①
  • MySQL存储架构
  • YoloV8改进策略:聚焦线性注意力重构YoloV8
  • 黑马程序员微服务 第五天课程 分布式搜索引擎2
  • 【详解】堡垒机和vpn是一个东西吗
  • 移远EC600U-CN开发板 11.17
  • ClickHouse的分片和副本
  • [分享]iOS开发-关于在xcode中引用文件夹右边出现问号的解决办法
  • 【译】理解JavaScript:new 关键字
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • 002-读书笔记-JavaScript高级程序设计 在HTML中使用JavaScript
  • es6--symbol
  • golang 发送GET和POST示例
  • jquery cookie
  • Js基础知识(一) - 变量
  • mysql外键的使用
  • PAT A1017 优先队列
  • Sublime Text 2/3 绑定Eclipse快捷键
  • Vue2.0 实现互斥
  • 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
  • 从零搭建Koa2 Server
  • 代理模式
  • 分享自己折腾多时的一套 vue 组件 --we-vue
  • 基于MaxCompute打造轻盈的人人车移动端数据平台
  • 极限编程 (Extreme Programming) - 发布计划 (Release Planning)
  • 爬虫模拟登陆 SegmentFault
  • 前端性能优化--懒加载和预加载
  • 手机端车牌号码键盘的vue组件
  • 树莓派 - 使用须知
  • 通过git安装npm私有模块
  • 微信小程序实战练习(仿五洲到家微信版)
  • 小而合理的前端理论:rscss和rsjs
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • ​ubuntu下安装kvm虚拟机
  • # 飞书APP集成平台-数字化落地
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • #pragma once
  • #ubuntu# #git# repository git config --global --add safe.directory
  • #vue3 实现前端下载excel文件模板功能
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • #我与Java虚拟机的故事#连载14:挑战高薪面试必看
  • (BFS)hdoj2377-Bus Pass
  • (function(){})()的分步解析
  • (java)关于Thread的挂起和恢复
  • (Matlab)遗传算法优化的BP神经网络实现回归预测
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释