迪米特法则

这篇具有很好参考价值的文章主要介绍了迪米特法则。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

迪米特法则,也称为最少知识原则(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类的直接交互。文章来源地址https://www.toymoban.com/news/detail-655461.html

到了这里,关于迪米特法则的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 通过简单的中介者模式模型了解迪米特法则(设计模式与开发实践 P14)

    虽然面向对象鼓励将行为分布到各个对象中,把对象划分成更小的粒度有利于对象可复用性,但有时对象之间联系太多又会反而降低可复用性 通过一个中介者对象封装 一组对象之间的交互 ,减少对象间直接耦合,对象之间的通信集中在中介者对象中,使得对象间交互更加简

    2024年02月07日
    浏览(36)
  • 喵叔闲扯--C# 中for和foreach的性能

    在C#中, for 和 foreach 是两种常用的循环结构,用于迭代集合中的元素。尽管它们在功能上相似,但它们在性能、空间效率和垃圾回收(GC)方面有一些区别。在下面的讨论中,我将详细解释这些方面,并提供相关的代码示例。 1. 时间效率: for 循环通常比 foreach 循环具有更高

    2024年02月16日
    浏览(36)
  • 数值分析(四) Hermite(埃尔米特)插值法及matlab代码

      本篇为 插值法专栏 第四篇内容讲述,此章主要讲述 Hermite(埃尔米特)插值法 及matlab代码,其中也给出详细的例子让大家更好的理解Hermite插值法 提示 之前已经介绍 牛顿插值法 和 三次样条插值 ,如果没看过前两篇的可以点击以下链接阅读 数值分析(一)牛顿插值法

    2024年02月10日
    浏览(57)
  • B站梨米特概率论与数理统计学习笔记(1)

    e:element 样本空间:sample space 例2:一个口袋有6只球,其中4只白球,2只红球,从袋中取球两次,每次随机地取一只,考虑两种取球方式: 一、条件概率的性质 例子:一个盒子中有四件产品,三只一等品,一只二等品,从中取产品两次,每次任取一只,作不放回抽样,设事件

    2024年02月11日
    浏览(36)
  • 【数学建模笔记】【第三讲】拉格朗日插值法,牛顿插值法,分段三次埃尔米特插值法及其MATLAB实践

    温馨提示:本文共有3748字,阅读并理解全文大概需要15-20分钟 数模比赛中,常常需要根据已知的函数点进行数据、模型的处理和分析,而有时候现有的数据是极少的,不足以支撑分析的进行,这时就 需要使用一些数学的方法,“模拟产生”一些新的但又比较靠谱的值来满足

    2024年02月05日
    浏览(44)
  • 线性代数中(线代中)的克莱姆法则,又译克拉默法则(Cramer‘s Rule)

    1.对于非齐次线性方程组: 求解过程就是用B去替换A的第i列,然后求出每次替换的行列式 解的结果就是: 第i个解 = 第i个替换行列式 / A的行列式 2.对于齐次线性方程组: 解就是 零解 二、方程组无解或者有两个不同的解,那么方程组的系数行列式=零 例子:求解下图 若λ=0,

    2024年02月12日
    浏览(47)
  • 4.7 克拉默法则

      行列式可以用来解线性方程组。对于常数项都是0并且系数矩阵是个方针的齐次线性方程组来说,如果行列式不为0,那么方程组只有零解,行列式为零的话,则有无穷个解。对于常数项不为0的非齐次线性方程组,那就复杂了。如果系数矩阵是个方阵,这时候可以用到克拉

    2024年02月08日
    浏览(45)
  • 14-矩阵相乘及其运算法则

    矩阵与向量的乘法 在这一篇文章中我们就将基于上一篇重新审视矩阵的这个视点来理解矩阵的乘法,那么在这一篇,我们主要来看一下矩阵和向量的乘法。这里这个线性方程组是上一小节给大家举的模拟的一个非常简单的小型经济系统的例子,我们可以把这个经济系统其实本

    2024年02月13日
    浏览(40)
  • 洛必达法则——“高等数学”

    各位CSDN的uu们你们好呀,今天,小雅兰的内容是洛必达法则,在之前的题目中,我们其实就已经提到过它了,只是没有单独讲出来,这篇博客,就让我们一起进入洛必达法则的世界吧  一、0/0型与无穷/无穷型未定式  二、其它类型的未定式 一、 0/0型与无穷/无穷型未定式 洛

    2024年02月02日
    浏览(31)
  • 极限运算法则——“高等数学”

    各位CSDN的uu们你们好啊,今天,小雅兰学习的内容是极限运算法则 回顾 无穷小的极限运算法则    定理1:两个无穷小的和是无穷小    定理2:有界函数与无穷小的乘积是无穷小 极限的四则运算法则    定理3    定理4    定理5:极限的保序性 例题    1.多项式(有理整函

    2024年02月02日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包