设计模式学习笔记——迪米特法则

YOLO26 旋转框检测 OBB 技术:角度预测与解码优化 YOLO26旋转框检测技术通过CSL角度编码有效解决了OBB检测中的周期性问题。该技术采用5参数表示法(cx,cy,w,h,θ),在检测头中分别处理分类、回归和角度预测。核心创新点包括:1)使用高斯或三角窗口的CSL编码对角度进行平滑表示;2)通过加权平均解码角度,避免边界不连续问题。该方法在遥感、文本检测等需要精确方向信息的场景中表现优异,相比传统HBB框可提升定位精度30%以上,同时保持了YOLO系列的高效特性。 阅读详情

迪米特法则是针对类之间的低耦合而提出的,它要求一个类应该对自己需要耦合或者调用的类知道的最少,即被耦合或调用的类的内部如何复杂,跟本类没有一点关系,本类就知道你提供给我多少public方法,本类就调用这些方法,其他的你不要让我知道。

这个法则有以下基层含义:

1、只和朋友类交流

什么是朋友类呢?即和自己相耦合的类。既然相耦合,那么肯定是这两个耦合的类之间要存在交互,那些不存在交互的,却耦合到了一起,这就不叫做朋友类,这也是设计的缺陷,不交互却耦合到了一起,可想而知,这样的设计维护性是很差的,应该尽量避免这样的设计。

2、朋友类间也是有间距的

即相耦合的类之间不能过于亲密,提供给我那么多public方法,让我欢喜让我忧啊。相耦合的类应该彼此知道的最少,用最少的方法提供给我需要的功能就可以了,这样一来,类间的耦合程度就降低了很多,不管是维护起来还是理解起来,都是比较容易的。下面举个例子:

在安装软件的时候,会有一个导向动作,第一步干什么,第二步干什么,其类图如下:


代码如下:

public class Wizard {
	private Random rand=new Random(System.currentTimeMillis());
	
	public int first(){
		System.out.println("第一步...");
		return rand.nextInt(100);
	}
	
	public int second(){
		System.out.println("第二步...");
		return rand.nextInt(100);
	}
	
	public int third(){
		System.out.println("第三步...");
		return rand.nextInt(100);
	}
}
public class InstallSoftware {
	public void installSoftware(Wizard wizard){
		int first=wizard.first();
		if(first>50){
			int second=wizard.second();
			if(second>50){
				int third=wizard.third();
				if(third>50){
					wizard.first();
				}
			}
		}
	}
}
public class Client {
	public static void main(String[] args) {
		InstallSoftware invoker=new InstallSoftware();
		invoker.installSoftware(new Wizard());
	}
}
我们看一下这样的设计有什么问题,Wizard类暴露给InstallSoftware类太多的方法,在installSoftware()方法中,用了Wizard提供的所有的public方法,这样的耦合度是不是有些太高了?假如说要将返回值从int修改为boolean,那么除了修改Wizard类外,还要大幅度修改InstallSoftware类,这样修改的风险就大大提高了啊,显然这不是一个好的设计,那么我们来看一看应用迪米特法则之后,改进的类图:

改进之后的代码:

public class Wizard {
	private Random rand=new Random(System.currentTimeMillis());
	
	private int first(){
		System.out.println("第一步...");
		return rand.nextInt(100);
	}
	
	private int second(){
		System.out.println("第二步...");
		return rand.nextInt(100);
	}
	
	private int third(){
		System.out.println("第三步...");
		return rand.nextInt(100);
	}
	
	public void installWizard(){
		int first=first();
		if(first>50){
			int second=second();
			if(second>50){
				int third=third();
				if(third>50){
					first();
				}
			}
		}
	}
}
public class InstallSoftware {
	public void installSoftware(Wizard wizard){
		wizard.installWizard();
	}
}
场景类不变,在Wizard类中新增了一个public的installWizard()方法,在本类内部对安装过程进行了封装,并且设置为公开的,而其他的方法都设置为私有的,即这个Wizard类对外只提供了installWizard()这个方法,在InstallSoftware类中,通过Wizard对象只调用这个方法,就可以实现功能,这样一来,类间的耦合度就降低了很多,若是要修改Wizard类中的返回值,影响的也只是Wizard类本身,其他的类不受影响,这就显示了类的高内聚特性。


小结:

一个类公开的public方法或是属性越多,修改时涉及的面也就越大,变更引起的风险扩散也就越大。

迪米特法则的核心就是类间的解耦,弱耦合,只有弱耦合以后,类的复用率才可用提高。



基于STM32的智能鱼缸设计 为了缓解学习、生活、工作带来的压力,提升生活品质,许多人喜欢在家中、办公室等场所养鱼。为节省鱼友时间、劳力、增加养鱼乐趣;为此,本文基于STM32单片机设计了一款智能鱼缸。该鱼缸可以实现水温检测、水质检测、自动或手动换水、氛围灯灯光变换和自动或手动喂食等功能为一体的控制系统,可通过控制键进行一键控制。... 阅读详情

相关推荐

离散小波-DWT

前沿:      小波变换比较复杂,而且内容

tianchang2you的专栏 4648

图解Java设计模式(一)

1) 优秀的程序应该是这样的:阅读时,感觉很优雅;新增功能时,感觉很轻松;运行时,感觉很快速,这就需要设计模式支撑。2) 设计模式包含了大量的编程思想,讲授和真正掌握并不容易,网上的设计模式课程不少,大多讲解的比较晦涩,没有真实的应用场景和框架源码支撑,学习后,只知其形,不知其神。就会造成这样结果: 知道各种设计模式,但是不知道怎么使用到真实项目。本课程针对上述问题,有针对性的进行了升级 (1) 授课方式采用 图解+框架源码分析的方式,让课程生动有趣好理解 (2) 系统全面的讲解了设计模式,包括 设计模式七大原则、UML类图-类的六大关系、23种设计模式及其分类,比如 单例模式的8种实现方式、工厂模式的3种实现方式、适配器模式的3种实现、代理模式的3种方式、深拷贝等3) 如果你想写出规范、漂亮的程序,就花时间来学习下设计模式吧课程内容和目标本课程是使用Java来讲解设计模式,考虑到设计模式比较抽象,授课采用 图解+框架源码分析的方式1) 内容包括: 设计模式七大原则(单一职责、接口隔离、依赖倒转、里氏替换、开闭原则、迪米特法则、合成复用)、UML类图(类的依赖、泛化和实现、类的关联、聚合和组合) 23种设计模式包括:创建型模式:单例模式(8种实现)、抽象工厂模式、原型模式、建造者模式、工厂模式。结构型模式:适配器模式(3种实现)、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式(3种实现)。行为型模式:模版方法模式、命令模式、访问者模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式(Interpreter模式)、状态模式、策略模式、职责链模式(责任链模式)2) 学习目标:通过学习,学员能掌握主流设计模式,规范编程风格,提高优化程序结构和效率的能力。

论文精读-ReTransformer ReRAM-based Processing-in-MemoryArchitecture for Transformer Acceleration

Transformer已经成为一种流行的深度神经网络(DNN)模型,用于神经语言处理(NLP)应用,并在神经机器翻译、实体识别等方面表现出优异的性能。然而,其在自回归解码器中的规模化点积注意机制在推理过程中带来了性能瓶颈。Transformer也是计算和内存密集型的,需要硬件加速解决方案。

a284365的博客 1923

迪米特法则

迪米特法则

Android应用开发工程师 554

手把手教你在openclaw中白嫖英伟达羊毛调用GLM5/Minimax2.1/Kimi K 2.5等模型

本文介绍如何在OpenClaw中免费调用英伟达平台的GLM5、Minimax2.1和Kimi K2.5等模型。通过在openclaw.json配置文件中添加NVIDIA的API信息,设置免费模型参数(如contextWindow和maxTokens),并执行简单命令即可切换默认模型。该方法可节省token消耗成本,最后需重启gateway使配置生效。文中还提供了使用其他API平台时的配置模板。

Science prince的博客 5103

芯片原厂linux驱动开发的分享

大家好,我是XX,来自湖南XX学院,电子信息18级,也曾在创新基地控制组学习过两三年,毕业后就职于一家芯片原厂的解决方案部,担任驱动工程师的职位,算上实习期,我的工作时长已有两年。在此我想将这两年期间学习与积累到的一些经验输出出来,与大家一同分享。知识面有限,只能简单介绍一些驱动开发方向的一些经验,且由于经验尚浅,文中难免会有一些疏漏和错误之处,还请大家积极地批评指正。

嵌入式技术开发 849

设计原则之【迪米特法则】,非礼勿近

迪米特原则(Law of Demeter LoD)是指一个对象应该对其他对象保持最少的了解,又叫最少知道原则(Least Knowledge Principle,LKP),尽量降低类与类之间的耦合。迪米特原则主要强调只和朋友交流,不和陌生人说话。出现在成员变量、方法的输入、输出参数中的类都可以称之为成员朋友类,而出现在方法体内部的类不属于朋友类。其含义是:如果两个软件实体无须直接通信,那么就不应当发生直接的相互调用,可以通过第三方转发该调用。其目的是降低类之间的耦合度,提高模块的相对独立性。

秃了也弱了 3289

19、硬件工程师笔试面试——无线通讯模块(2025版本)

例如,如果你的项目需要传输大量数据,如视频流或大数据文件,那么你可能需要一个高速率的模块,如支持802.11ac或802.11ax(WiFi 6)的模块。如果你的数据传输需求较小,如传感器数据,那么一个较低速率的模块,如蓝牙或Zigbee,可能就足够了。较高的频率(如5GHz)提供更大的带宽,支持更高的数据传输速率,但信号覆盖范围较小,穿透能力较弱。例如,在蓝牙通信中,一台设备作为主机,另一台设备作为从机,它们通过频率跳频的方式确定连接,并在连接建立后通过特定的协议进行数据交换。

XU157303764的博客 3228

迪米特法则--设计模式

它的核心思想是:一个对象应该。Demeter,LoD)是一种有助于降低类之间耦合度的原则,但过度地应用迪米特法则。为了遵循 "不该有直接依赖关系的类之间,不要有依赖"原则,我们可以引入抽象来解。这种实现符合 "有依赖关系的类之间,尽量只依赖必要的接口" 原则,降低了类与类。每个模块只和自己的朋友“说话”(talk),不和陌生人“说话”(talk)。"不该有直接依赖关系的类之间,不要有依赖"这个原则强调的是降低类与类之间的耦。"有依赖关系的类之间,尽量只依赖必要的接口"这个原则强调的是,当一个类需要依。

开源驱动,创造价值;坦诚清晰,快速失败;让复杂可计算。 1034

【图像超分】论文复现:经典超分 | SAN的Pytorch源码复现,跑通源码,适配高版本的python/pytorch/cuda,使用EDSR-PyTorch进行训练和测试

本文介绍了单幅图像超分辨率重建方法SAN(二阶注意网络)的代码实现。文章详细说明了在高版本Python/Pytorch环境下适配SAN源码的方法,并提供了修改后的完整代码和预训练模型下载链接。 主要亮点包括: 将SAN模型实现整合到EDSR-Pytorch框架中,解决了高版本环境下的兼容性问题 提供了完整的数据集准备指南(DIV2K训练集和5个测试集) 给出了详细的测试命令,涵盖x2、x3、x4不同放大倍率 公开了预训练模型和可视化结果的下载资源 提供了修改后的适配高版本环境的代码。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 1414

高通camx hal进程dump日志分析四:Node DumpDebugInfo原理分析

摘要: 本文讲解了高通Camx架构中DumpDebugInfo的原理,重点分析了Node组件的DumpDebugInfo()方法。该方法会输出Node自身调试信息,并调用DumpFenceErrors()接口输出Fence错误信息。具体包括:检查请求队列状态、输出未完成请求的元数据/完成状态/未处理Fence数量等关键信息,以及Fence错误原因(如延迟、未触发、结果失败等)。通过代码注释详细解析了各字段含义,为后续分析Dump异常日志提供理论基础。

786

设计模式学习笔记 - 设计原则 - 8.迪米特法则(LOD)

迪米特法则,是一个非常实用的原则。利用这个原则,可以帮我们实现代码的 “高内聚、松耦合”。

chenjian723122704的专栏 1210

拉曼光谱入门:7.拉曼光谱仪光学系统结构详解

本文系统拆解了拉曼光谱仪从激光器输出经聚焦照明、二向色镜/陷波滤光片组滤除瑞丽散射、衍射光栅色散至CCD探测的完整光路,阐述了各光学模块在微弱非弹性散射信号提取、杂散光抑制及高分辨光谱成像中的工程原理与技术参数要求。

qq_53529450的博客 224

设计模式学习笔记七、迪米特法则

一、介绍 1、迪米特法则(Law of Demeter)又叫作最少知识原则(Least Knowledge Principle 简写LKP),一个类对于其他类知道的越少越好,就是说一个对象应当对其他对象有尽可能少的了解,只和朋友通信,不和陌生人说话。英文简写为: LoD. 2、一个对象应该对其他对象保持最少了解。 3、类与类的关系越密切耦合度越大 4、与直接对象交换信息、直接朋友。(成员、类内部方法的参数、类方法的返回值) 5、陌生的类最好不要以局部变量的形式出现在类的内部。 二、代码 1、演

promiseful的博客 425

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

迪米特法则_大话设计模式学习笔记11

迪米特法则 迪米特法则(Law of Demeter, LoD)又叫做最少知识原则,要求一个对象应该对其他对象有最少的了解,其意义在于降低类之间的耦合。 核心观念: 类间解耦,弱耦合 规则: 如果两个类不必彼此通信,那么这两个类就不应当发生直接的相互作用。如果其中一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用。 优点: 类之间的耦合越弱,越有利于复用,一个处在弱耦...

clzZ2的博客 1010

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

设计模式学习笔记之迪米特法则

迪米特法则也称为最少知识原则,虽然名字不同,但是描述的是同一个规则:一个对象应该对其他对象有最少的了解。通俗地讲,一个类应该对自己需要耦合或调用的类知道得最少,你(被耦合或调用的类)的内部是如何复杂都和我没关系,那是你的事情,我就知道你提供的这么多public方法,我就调用这么多,其他的我一概不关心。 迪米特法则对类的低耦合提出了明确的要求,其包含以下4层含义:(1)只和朋友交流(2)朋友间也是

GeneralAndroid的专栏 1132

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

[学习笔记]设计模式-迪米特法则

狭义的迪米特法则 如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。如果其中的一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用。 狭义的迪米特法则的缺点: 在系统里造出大量的小方法,这些方法仅仅是传递间接的调用,与系统的业务逻辑无关。 遵循类之间的迪米特法则会是一个系统的局部设计简化,因为每一个局部都不会和远距离的对象有直接的关联。但是,这也会造成系统的不同模块之间的通信效率降低,也会使系统的不同模块之间不容易协调。 门面...

青云的博客 258

大话设计模式学习笔记(11)——迪米特法则

这一篇比较水 只是介绍这样一个法则: 迪米特法则 如果两个类不必彼此通信,那么这两个类就不应当发生直接的相互作用。如果其中一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用。 简而言之,不相关的类之间就应该没有可见性。如果非要调用,可以通过代理模式。实质强调的就是低耦合。...

秋千不会坠的博客 233

学习笔记(06):C++ 设计模式原理与实战大全-架构师需备课程-门面(外观)模式Facade的定义、场景与实用工程技术:LOD迪米特法则...

C++属于难学易用的工程开发语言,C++繁复的语法往往使得开发人员过于强调细节而缺乏软件体系结构的大局观。特别需要指出的是,缺乏面向对象的软件设计能力是制约从业人员从开发者向设计者转变的重要因素。设计模式是来源于工业实践的重要开发经验,它实际上是面向对象的数据结构,掌握设计模式是掌握面向对象设计的根本要求,该课程基于C++语言讲解设计模式。...

suuare的博客 307

设计模式 学习笔记(5)迪米特法则、外观模式、建造者模式

(11)迪米特法则   迪米特法则(LoD)也叫最少知识原则。如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。如果其中一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用。   迪米特法则首先强调的前提是在类的结构设计上,每一个类都应当尽量降低成员的访问权限,,也就说一个字段或行为若不需要别的类知道就不用公开,包装好自己的private状态。需要公开的话就用属...

weixin_30318645的博客 122

设计模式学习笔记(三)

设计模式学习笔记(三)

qq_17514043的博客 139

Java 设计模式学习笔记(7月15号)

文章目录作者信息前言一.六大设计原则1.1 开闭原则(Open Close Principle,OCP)1.2 单一职责原则(Single Responsibility Principle,SRP)1.3 里氏代换原则(Liskov Substitution Principle,LSP)1.4 依赖倒置原则(Dependence Inversion Principle,DIP)1.5 接口隔离原则...

Yuchao Huang ' s Blog 493

设计模式学习笔记--七大原则

设计模式学习笔记 七大原则 一、开闭原则(Open Closed Principle ,OCP) 含义 当应用的需求改变时,在不修改软件实体的源代码或者二进制代码的前提下,可以扩展模块的功能,使其满足新的需求。 作用 测试时只需要对拓展的代码进行测试 提高代码的复用性 提高软件的可维护性 二、里氏替换原则(Liskov Substitution Principle,LSP) 定义 继承必须确保超类所拥有的性质在子类中仍然成立。–> 子类可以扩展父类的功能,但不能改变父类原有的功能 里氏替换原是继承

Wang_0202的博客 252

设计模式之迪米特法则LoD(最少知识原则)

迪米特法则(LoD),如果两个类不必彼此直接通信,

qq279880252的专栏 983

[特殊字符]【设计模式 秘密武器】迪米特法则 (LoD) 解密 | 你的代码“社交恐惧”了吗?只和朋友说话,拒绝连环调用!

文章标题:🚀【设计模式 秘密武器】迪米特法则 (LoD) 解密 | 你的代码“社交恐惧”了吗?只和朋友说话,拒绝连环调用!标签: #Java #设计模式 #迪米特法则 #LoD #最少知识原则 #面向对象 #代码耦合 #优快云哈喽,各位在 优快云 奋斗的小伙伴们!👋 今天我们来聊聊设计模式六大原则中的最后一个,也是一个听起来有点“神秘”的原则——迪米特法则 (Law of Demeter, LoD)!✨ 它还有一个更直白的名字,叫做最少知识原则 (Least Knowledge Principle,

WD1213484的博客 987

《设计模式》——迪米特法则

定义   其实《设计模式之禅》关于原则的部分,我最喜欢的就是《迪米特法则》没什么特殊原因,前段时间部门培训,让我出个培训内容,就是选择的迪米特法则。其实原因很简单,就因为看它名字都不知道究竟是拿来干啥的。 先臭美一下《设计模式》——目录,然后让我们进入正题。   所以究竟什么是迪米特法则呢?   迪米特法则(Law of Demeter,LoD)也称为最少知识原则(Least Knowledg...

半寿翁的博客 985
上一篇: 设计模式学习笔记——接口隔离原则
下一篇: 设计模式学习笔记——开闭原则
hackerain
博客等级 码龄16年 753粉丝 220原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值