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


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

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

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

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

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

    1. class Product {
    2.     private String name;
    3.     private double price;
    4.     public Product(String name, double price) {
    5.         this.name = name;
    6.         this.price = price;
    7.     }
    8.     public double getPrice() {
    9.         return price;
    10.     }
    11. }
    12. class Order {
    13.     private List products = new ArrayList<>();
    14.     public void addProduct(Product product) {
    15.         products.add(product);
    16.     }
    17.     public double calculateTotalPrice() {
    18.         double totalPrice = 0;
    19.         for (Product product : products) {
    20.             totalPrice += product.getPrice();
    21.         }
    22.         return totalPrice;
    23.     }
    24. }
    25. class Customer {
    26.     private List orders = new ArrayList<>();
    27.     public void addOrder(Order order) {
    28.         orders.add(order);
    29.     }
    30.     public void printTotalSpent() {
    31.         double totalSpent = 0;
    32.         for (Order order : orders) {
    33.             totalSpent += order.calculateTotalPrice();
    34.         }
    35.         System.out.println("Total amount spent: " + totalSpent);
    36.     }
    37. }

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

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

    1. class Product {
    2.     private String name;
    3.     private double price;
    4.     public Product(String name, double price) {
    5.         this.name = name;
    6.         this.price = price;
    7.     }
    8.     public double getPrice() {
    9.         return price;
    10.     }
    11. }
    12. class Order {
    13.     private List products = new ArrayList<>();
    14.     public void addProduct(Product product) {
    15.         products.add(product);
    16.     }
    17.     public double calculateTotalPrice() {
    18.         double totalPrice = 0;
    19.         for (Product product : products) {
    20.             totalPrice += product.getPrice();
    21.         }
    22.         return totalPrice;
    23.     }
    24. }
    25. class Customer {
    26.     private List orders = new ArrayList<>();
    27.     public void addOrder(Order order) {
    28.         orders.add(order);
    29.     }
    30.     public double calculateTotalSpent() {
    31.         double totalSpent = 0;
    32.         for (Order order : orders) {
    33.             totalSpent += order.calculateTotalPrice();
    34.         }
    35.         return totalSpent;
    36.     }
    37. }
    38. class ShoppingCart {
    39.     private List products = new ArrayList<>();
    40.     public void addProduct(Product product) {
    41.         products.add(product);
    42.     }
    43.     public double calculateTotalPrice() {
    44.         double totalPrice = 0;
    45.         for (Product product : products) {
    46.             totalPrice += product.getPrice();
    47.         }
    48.         return totalPrice;
    49.     }
    50. }

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

  • 相关阅读:
    Ubuntu安装Samba(阿里云服务器、samba端口映射)
    一文搞懂MobileNet v1网络
    【阅读笔记】理解表驱动设计
    虚拟机挂起后再解挂后网络图标消失,没有网络/虚拟机ubuntu系统没有网络
    tcpdump抓包详解
    数据分析思维与模型:相关分析法
    LeetCode-143. 重排链表-Java-medium
    有一个整形数组, a[3] = {7,2,5}, 要求使用指针实现数组成员由小到大的顺序排列,即结果为:a[3] = {2,5,7};(C++指针练习2)
    【图像压缩】基于二叉树和优化截断(BTOT)实现遥感图像压缩附matlab代码
    USB2.0 UTMI PHY芯片测试
  • 原文地址:https://blog.csdn.net/gangzhucoll/article/details/134453639