设计模式7大原则——迪米特法则解析(含源码示例)

RC正弦波振荡电路实验全解析:如何通过调节电容电阻改变输出频率 本文深入解析RC正弦波振荡电路,重点阐述如何通过调节电容和电阻来精确改变输出频率。文章从文氏桥振荡电路的核心原理出发,详细介绍了电容粗调频段与电阻微调频率的实操策略,并分析了元件误差、寄生参数等对实测频率的影响,为电路设计与调试提供了从理论到实践的完整指南。 阅读详情

一、定义

迪米特法则的定义是:只与你的直接朋友交谈,不跟“陌生人”说话(Talk only to your immediate friends and not to strangers)。

其含义是:如果两个软件实体无须直接通信,那么就不应当发生直接的相互调用,可以通过第三方转发该调用。其目的是降低类之间的耦合度,提高模块的相对独立性。

迪米特法则中的“朋友”是指:当前对象本身、当前对象的成员对象、当前对象所创建的对象、当前对象的方法参数等,这些对象同当前对象存在关联、聚合或组合关系,可以直接访问这些对象的方法。

二、实现方法

从迪米特法则的定义和特点可知,它强调以下两点:

  1. 从依赖者的角度来说,只依赖应该依赖的对象。

  2. 从被依赖者的角度说,只暴露应该暴露的方法。


所以,在运用迪米特法则时要注意以下 6 点

  1. 在类的划分上,应该创建弱耦合的类。类与类之间的耦合越弱,就越有利于实现可复用的目标。

  2. 在类的结构设计上,尽量降低类成员的访问权限。

  3. 在类的设计上,优先考虑将一个类设置成不变类。

  4. 在对其他类的引用上,将引用其他对象的次数降到最低。

  5. 不暴露类的属性成员,而应该提供相应的访问器(set 和 get 方法)。

  6. 谨慎使用序列化(Serializable)功能。

说这么多,下面我们举两个例子来说明一下。

三、实例1:定外卖

外卖软件大家都有吧,现在点外卖已经成了绝大部分人每天都会发生的动作,现在我们假设,有位客户点了一份披萨店的外卖,订单产生之后,披萨店接收了订单并开始为客户准备披萨,代码如下:

public class PizzaStore {
 
    public void takeOrder() {
        System.out.println("披萨店接收订单");
    }
 
    public void prepareSource() {
        System.out.println("披萨店准备披萨制作原料");
    }
 
    public void cookPizza() {
        System.out.println("披萨店烹制披萨");
    }
 
    public void packPizza() {
        System.out.println("披萨店打包披萨");
    }
 
    public void deliveryPizza() {
        System.out.println("披萨店配送披萨");
    }
}
public class Customer {
 
    public void orderPizza(PizzaStore pizzaStore){
        pizzaStore.takeOrder();
        pizzaStore.prepareSource();
        pizzaStore.cookPizza();
        pizzaStore.packPizza();
        pizzaStore.deliveryPizza();
    }
}

下面我们下一个订单,代码如下:

    public static void main(String[] args){
        Customer xiaoming = new Customer();
        PizzaStore pizzaStore = new PizzaStore();
        xiaoming.orderPizza(pizzaStore);
    }

这样写代码貌似没有问题,但是我们可以看到当你发起订单后调用披萨店的一个整个过程太复杂,包括接收订单、准备原材料、制作披萨、打包、配送等,对于客户来说只需要:“我给你订单,你给我披萨”。可是现在客户知道了过多的披萨店的方法,这个就是违反迪米特法则的例子,我们按照迪米特法则进行修改。

public class PizzaStore {
 
    private void takeOrder() {
        System.out.println("披萨店接收订单");
    }
 
    private void prepareSource() {
        System.out.println("披萨店准备披萨制作原料");
    }
 
    private void cookPizza() {
        System.out.println("披萨店烹制披萨");
    }
 
    private void packPizza() {
        System.out.println("披萨店打包披萨");
    }
 
    private void deliveryPizza() {
        System.out.println("披萨店配送披萨");
    }
 
    public void orderPizza() {
        takeOrder();
        prepareSource();
        cookPizza();
        packPizza();
        deliveryPizza();
    }
}
public class Customer {
 
    public void orderPizza(PizzaStore pizzaStore){
        pizzaStore.orderPizza();
    }
 
}
    public static void main(String[] args){
        Customer xiaoming = new Customer();
        PizzaStore pizzaStore = new PizzaStore();
        xiaoming.orderPizza(pizzaStore);
    }

这样改之后,客户和披萨店之间的沟通只有orderPizza()方法了,其他的方法客户根本访问不了,因为其他方法都是private属性。这样极大的减少了二者之间的沟通,这就是迪米特法则所要求的尽量减少两个实体之间的交互。我们可以进一步找一个代理类来解耦二者之间的沟通,代码如下:

//定披萨代理类
public class PizzaStoreProxy {
    private PizzaStore pizzaStore;
 
    public PizzaStoreProxy(PizzaStore pizzaStore) {
        this.pizzaStore = pizzaStore;
    }
 
    public void orderPizza() {
        pizzaStore.takeOrder();
        pizzaStore.prepareSource();
        pizzaStore.cookPizza();
        pizzaStore.packPizza();
        pizzaStore.deliveryPizza();
    }
}
//客户类
public class Customer {
 
    public void orderPizza(PizzaStoreProxy pizzaStoreProxy){
        pizzaStoreProxy.orderPizza();
    }
 
}
  public static void main(String[] args){
        Customer xiaoming = new Customer();
        PizzaStore pizzaStore = new PizzaStore();
        PizzaStoreProxy pizzaStoreProxy = new PizzaStoreProxy(pizzaStore);
        xiaoming.orderPizza(pizzaStoreProxy);
    }

可以看到通过引入一个代理类,客户现在只跟披萨店代理打交道,完全不关披萨店的事,也不知道披萨店的内部实现,实现了解耦。其实这个代理类这就好比现在的美团,我们只在美团下披萨外卖订单,其他事就不需要我们管了,比如:如何做披萨、如何送披萨等等。美团在这里就起到代理的作用。

四、实例2:明星与经纪人的关系。

明星不仅全心投入艺术,还要干两件事:与粉丝的见面会,与媒体公司的业务洽谈。这些事就由经纪人负责处理。这里的经纪人是明星的朋友,而粉丝和媒体公司是陌生人,所以适合使用迪米特法则。

//经纪人
class Agent {
    private Star myStar;
    private Fans myFans;
    private Company myCompany;
    public void setStar(Star myStar) {
        this.myStar = myStar;
    }
    public void setFans(Fans myFans) {
        this.myFans = myFans;
    }
    public void setCompany(Company myCompany) {
        this.myCompany = myCompany;
    }
    public void meeting() {
        System.out.println(myFans.getName() + "与明星" + myStar.getName() + "见面了。");
    }
    public void business() {
        System.out.println(myCompany.getName() + "与明星" + myStar.getName() + "洽谈业务。");
    }
}
//明星
class Star {
    private String name;
    Star(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
}
//粉丝
class Fans {
    private String name;
    Fans(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
}
//媒体公司
class Company {
    private String name;
    Company(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
}

使用方法如下:

 public static void main(String[] args) {
        Agent agent = new Agent();
        agent.setStar(new Star("某迪"));
        agent.setFans(new Fans("某迪小粉丝"));
        agent.setCompany(new Company("中国传媒有限公司"));
        agent.meeting();
        agent.business();
    }

程序的运行结果如下:

某迪小粉丝与明星某迪见面了。
中国传媒有限公司与明星某迪洽谈业务。

五、迪米特法则的优点和缺点

迪米特法则要求限制软件实体之间通信的宽度和深度,正确使用迪米特法则将有以下两个优点。

  • 降低了类之间的耦合度,提高了模块的相对独立性。

  • 由于亲合度降低,从而提高了类的可复用率和系统的扩展性。

但是,过度使用迪米特法则会使系统产生大量的中介类,从而增加系统的复杂性,使模块之间的通信效率降低。所以,在釆用迪米特法则时需要反复权衡,确保高内聚和低耦合的同时,保证系统的结构

关注我,java学习不头秃,还为每位粉丝准备了一份全面的资料福利,从面试简历模板到大厂面经汇总,从大厂内部技术资料到互联网高薪必读书单,以及Java面试核心知识点(283页)和Java面试题合集2022年最新版(485页)等等,有需要的可以点下方名片领取

【GlobalMapper精品教程】001:GlobalMapper23+24+25 Pro-x64中文汉化版安装教程(附软件包下载) Global Mapper 23+V24+V25中文汉化版安装教程及免费下载地址,是一款非常专业的地图绘制软件,功能非常的丰富,内置距离和面积计算,包括光栅混合、对比度调节、海拔高度查询、视线计算以及一些高级功能,通过地表数据观察分水岭、对3Dpoint数据转换为三角多边形和网格化等设置。本文讲解GlobalMapper23.1 Pro-x64安装过程。 阅读详情

相关推荐

FPGA实现高效数字下变频:CORDIC与CIC滤波器的Verilog优化设计

本文深入探讨了FPGA实现高效数字下变频的技术方案,重点介绍了CORDIC算法与CIC滤波器的Verilog优化设计。通过详细的算法原理分析、FPGA实现技巧和实战经验分享,展示了如何利用CORDIC的旋转运算替代乘法操作,以及CIC滤波器在降采样中的高效性能。文章还提供了完整的系统集成方案和资源优化策略,为无线通信和雷达信号处理领域的工程师提供了实用参考。

redis7keeper的博客 724

Java设计模式——迪米特法则(实例)

1、基本介绍 一个对象应该对其它对象保持最少的了解 类与类越密切,耦合度越大 迪米特法则又叫最少知道原则,即一个类对自己依赖的类知道的越少越好。也就是说,对于被依赖的类不管多么复杂,都尽量将逻辑封装在类的内部。对外除了提供public方法,不对外泄露任何信息 迪米特法则还有个更简单的定义:至于直接的朋友通信 直接的朋友:每个对象都会与其他对象有耦合关系,只要两个对象之间有耦合关系,这两个对象就是朋友关系。耦合的方式很多:依赖、关联、组合、聚合等。其中成员变量,方法参数,方法返回值中的类为直接朋友,而出现在

走在bug的路上 2635

51单片机——LCD12864驱动函数深度解析与实战优化

本文深入解析了51单片机驱动LCD12864液晶屏的核心驱动函数,从底层时序、关键延时到地址计算进行逐行剖析,并针对常见显示问题提供系统性的调试技巧与实战优化方案。重点探讨了如何将基础代码优化为稳定高效的驱动,涵盖延时精准化、批量写入及显示缓冲区等高级技巧,旨在帮助开发者从“点亮”屏幕进阶到“精通”驱动,确保显示稳定可靠。

weixin_29190169的博客 86

软件设计七大原则之迪米特法则

迪米特法则的定义 迪米特法则(Law of Demeter,LoD)又叫作最少知识原则(Least Knowledge Principle,LKP),产生于 1987 年美国东北大学(Northeastern University)的一个名为迪米特(Demeter)的研究项目,由伊恩·荷兰(Ian Holland)提出,被 UML 创始者之一的布奇(Booch)普及,后来又因为在经典著作《程序员修炼之道》(The Pragmatic Programmer)提及而广为人知。 迪米特法则的定义是:只与你的直接朋

程序员客栈 517

qt实现程序密钥注册功能,MD5加密+AES加密,并实现一台电脑系统一个密钥

qt实现了一个给自己软件加密的功能。 原理是: 需要被注册的软件第一次运行的时候,在系统的注册表里面注册一个键值,如下: 这个值作为生成密钥的用户识别号,然后生成密钥文件key.db,把这个key.db文件放到软件执行目录下,即可完成软件的注册并正常使用软件。 软件第一次打开的界面及密钥生成工具软件界面如下: 将密钥生成工具软件生成的key.db放到软件执行目录下之后,软件即可正常使用,如下图: 代码使用了MD5加密 外加 AES加密, 解密和加密的核心代码如下: QSt.

weixin_43935474的博客 4130

在VS2019里把JSBSim飞行模型集成到你的C++项目里(附完整配置流程和常见错误解决)

本文详细介绍了如何在Visual Studio 2019中将JSBSim飞行模型集成到C++项目中,包括环境准备、源码编译、项目配置和常见错误解决方案。通过实战技巧和优化建议,帮助开发者高效实现高精度飞行仿真功能,提升开发效率。

weixin_42620202的博客 414

迪米特法则简单例子

文章目录一、迪米特法则二、概念理解三、代码实例1.简单工厂2.代码输出总结 一、迪米特法则 概念:也称最小化原则。当两个类之间直接通信的时候,会造成高度依赖的后果(高耦合)。解决此问题的办法,尽量避免两个类直接接触(低耦合),通过一个第三者做转发。 二、概念理解 关系:A->B->C 类和类之间不直接通信,加入第三者类进行通信,从而达到解耦效果 三、代码实例 1.简单工厂 public class SimpleFactory { //配置用户的需求 pr

weixin_44458540的博客 1211

相位相关匹配法的opencv C++实现

这一段就是PCIAM算法的核心了,计算两幅图像的峰值相关矩阵,也是完全按照matlab移植过来的,但是后面几行,是为了筛选一些不可能存在的情况,比如边缘处的完全重合,或者只有一行,或者一列重合等等情况,由于PCIAM算法在边缘处的响应值高,所以在一些场景下可能是一种干扰,所以进行了剔除,当然可以不剔除,就是对后期的峰值选取会有影响。头文件,以及各类函数,还有主函数,第一次独立的写这种分文件类型的项目,写的拉跨还请包涵,以及当然可以转成类的形式,但感觉有点小麻烦,后期再修改吧。

qq_43616651的博客 4267

设计模式之——“迪米特法则”(“最少知道”原则)

设计模式之——“迪米特法则”(“最少知道”原则) 什么是“迪米特法则” 迪米特法则(Law of Demeter)又叫作最少知识原则(Least Knowledge Principle 简写LKP),就是说一个对象应当对其他对象有尽可能少的了解,不和陌生人说话。 上面是摘自百度百科对于“迪米特法则”的解释,相信有很多同学看完这段解释还是处于一脸懵逼的状...

扬俊的小屋 3361

基于MacOS本地部署OpenClaw+Ollama技术要点

本文基于MacOS系统下本地部署OpenClaw+Ollama的实操经验,梳理部署全流程中的核心技术要点、环境配置规范、故障排查方法及落地优化方案,聚焦“本地AI模型联动OpenClaw技能调度”的核心需求,为同类本地部署场景提供可复用的技术参考,规避常见部署风险,确保系统稳定运行。

在科技赋能新时代,共同探索基础理论和宇宙未知。 5167

【ESP32实战】SPI驱动ILI9341屏幕:从基础绘图到汉字显示

本文详细介绍了如何使用ESP32通过SPI驱动ILI9341屏幕,从基础连接、SPI初始化到实现基础绘图、数字显示及汉字显示的全过程。文章包含实用的代码示例和优化技巧,帮助开发者快速掌握屏幕驱动技术,提升显示性能。特别针对常见问题如花屏、刷新率等提供了解决方案。

weixin_29164091的博客 622

设计模式原则——迪米特法则原则

设计模式原则——迪米特法则原则。

luck_lsj的博客 953

【软件测试】人工智能(AI)在软件测试领域的应用

AI在软件测试领域的应用使测试过程更加自动化、高效和智能。它可以帮助测试团队减轻负担,更快地识别和修复问题,最终提高软件的质量和可靠性。随着AI技术的不断进步,未来AI在软件测试领域的应用将更加广泛和深入。

weixin_46453070的博客 4388

23种设计模式-7大原则

23种设计模式(尚硅谷) 这个很重要,这边时间问题就没有看视频了,直接对着ppt手敲吧 先来看常见面试题 关于原型设计模式的的问题 1.UML类图画出原形模式核心角色,这个应该碰到过 2.原型设计模式的深拷贝和浅拷贝是什么,并写出深拷贝两种深拷贝的两种方式的源码( 重写clone方法实现深拷贝,使用序列化来实现深拷贝) 3.再spring框架中哪里使用到原型模式,并对源码进行分析 beans.xml <bean id="id01"class=“com,atguigu.spring.bean.Mon

weixin_46027945的博客 235

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

设计模式(一)——设计模式的七大原则

一、引子 1.1 设计模式常用的七大原则有: 1) 单一职责原则 2) 接口隔离原则 3) 依赖倒转原则 4) 里氏替换原则 5) 开闭原则ocp 6) 迪米特法则 7) 合成复用原则 1.2 几个经典的设计模式面试题 1.2.1 金融借贷平台项目——状态模式 借贷平台的订单,有审核发布抢单等等步骤,随着操作的不同,会改变订单的状态,项目中的这个模块实现就会使用到状态模式,请你使用状态模式进行设计,并完成实际代码 问题分析 这类代码难以应对变化,在添加一种状态时,我...

一直走,不要回头 1510

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

设计模式——设计模式简介和七大原则

设计模式的目的和核心原则、单一职责原则、接口隔离原则、依赖倒转原则、里氏替换原则、开闭原则、迪米特法则、合成复用原则

种一棵树最好的时间是十年前,其次是现在 2633

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

设计模式七大原则及概述

设计模式七大原则及概述1.设计模式的经典面试题原型设计模式问题设计模式的七大原则:Ø 解释器设计模式2.设计模式7大原则2.1 设计模式的目的2.2 设计模式七大原则2.3 单一职责原则2.1.1 基本介绍2.1.2 应用实例2.1.3 单一职责原则注意事项和细节2.4 接口隔离原则(Interface Segregation Principle)2.4.1 基本介绍2.4.2 应用实例2.4.3 应传统方法的问题和使用接口隔离原则改进2.5 依赖倒转原则2.5.1 基本介绍2.5.2 依赖关系

博文致力于人工智能算法的探索研究;前后端分离项目的技术分享交流;专升本计算机基础课程内容讲解;各种中间件技术分享 772

设计模式七大原则

设计模式七大原则 目录1、单一职责2、接口隔离3、里氏替换(加强理解)4、依赖倒置5、开闭原则6、迪米特法则7、合成复用原则 1、单一职责 一个类只负责一个职责。 可以降低类的复杂度,一个类只负责一项职责,其逻辑肯定要比负责多项职责简单的多。 提高类的可读性,提高系统的可维护性。 变更引起的风险降低,变更是必然的,如果单一职责原则遵守的好,当修改一个功能时,可以显著降低对其他功能的影响。 2、接口隔离 一个类对另一个类的依赖应该建立在最小接口上,通过实际业务拆分接口,多实现来做到不需要的不依赖。 接口尽量小

Mr_Wanter 480

写了这么久代码你了解Java面向对象的设计原则吗?

面向对象设计原则是学习设计模式的基础,每一种设计模式都符合某一种或多种面向对象设计原则。通过在软件开发中使用这些原则,可以提高软件的可维护性和可复用性,让我们可以设计出更加灵活也更容易扩展的软件系统,实现可维护性复用的目标。

Elegance never goes out of fashion 5578

Java设计模式(一)——————设计模式介绍,设计模式七大原则

什么是设计模式 软件设计模式(Design pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。 设计模式的目的​​​​​​​ 1)、代码重用性(相同功能的代码,不用多次编写) 2)、可读性(编程规范性,便于其他人的阅读和理解) 3)、可扩展性(...

不积跬步无以至千里 1363

23种常见设计模式详解

23中常见设计模式详解

写代码的渣渣苏 4964

跟我学Java设计模式第一天:设计模式概述和软件设计原则

文章目录1,设计模式概述1.1 软件设计模式的产生背景1.2 软件设计模式的概念1.3 学习设计模式的必要性1.4 设计模式分类2,UML图2.1 类图概述2.2 类图的作用2.3 类图表示法2.3.1 类的表示方式2.3.2 类与类之间关系的表示方式2.3.2.1 关联关系2.3.2.2 聚合关系2.3.2.3 组合关系2.3.2.4 依赖关系2.3.2.5 继承关系2.3.2.6 实现关系3,软件设计原则3.1 开闭原则3.2 里氏代换原则3.3 依赖倒转原则3.4 接口隔离原则3.5 迪米特法则3.6

黑马程序员官方博客 421

设计模式的七大原则,初次在博客写文章主要参考了视频的内容!

这里写自定义目录标题设计模式设计模式的目的设计模式的七大原则单一职责原则接口隔离原则依赖倒转原则里氏替换原则开闭原则合成复用原则 设计模式 今天第一次发博客,也是初次了解设计模式,先培养一下自己写博客的能力!首先先说一下设计模式的七大原则把。 设计模式的目的 软件的编写过程中,程序员总面临着来自 耦合性、内聚性以及可维护性、可扩展性、重用性、灵活性等多方面的挑战,设计模式会让程序员写代码具有更好的; 1)代码重用性 (即:相同功能的代码,不用多次编写) 2)可读性 (即:编程规范性, 便于其他程序员的阅读

qq1246827263_com的博客 255

设计模式-七大软件设计原则

设计模式 参考资料 图解设计模式 大话设计模式 设计模式之禅 github我见过最好的设计模式 http://c.biancheng.net/view/1326.html 基本原则 开闭原则 在设计的时候尽可能的考虑,需求的变化,新需求来了尽可能少的改动代码,拥抱变化 定义:指的是软件中一个实体,如类、模块和函数应该对扩展开放,对修改关闭。 面向抽象编程 开闭是对扩展和修改的约束 强调:用抽象构建框架,用实现扩展细节。 优点:提高软件系统的可复用性及可维护性 面向对象最基础的设计原则 指导我们构建

黄金时代的架构之路 266

设计模式-00-简介

1)第1层:刚开始学编程不久,听说过什么是设计模式2)第2层:有很长时间的编程经验,自己写了很多代码,其中用到了设计模式,但是自己却不知道3)第3层:学习过了设计模式,发现自己已经在使用了,并且发现了一些新的模式挺好用的4)第4层:阅读了很多别人写的源码和框架,在其中看到别人设计模式,并且能够领会设计模式的精妙和带来的好处5)第5层:代码写着写着,自己都没有意识到使用了设计模式,并且熟练的写了出来1)设计模式是程序员在面对同类软件工程设计问题所总结出来的有用的经验。

被拯救的威尼斯的博客 1343

韩老师设计模式1:7原则。依赖关系3种方法。UML类图6关系。

设计模式:依 里 接 单 开 合 笛 7原则。依赖关系3种方法(形参,构造,set方法)。UML类图6关系(依赖 关联 继承 实现 聚合 组合)。

qq120631157的博客 376
上一篇: 设计模式7大原则——开闭&单一职责&里氏替换
下一篇: 设计模式7大原则——接口隔离原则解析(含代码示例)
架构文摘JGWZ
博客等级 码龄5年 8808粉丝 345原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值