迪米特法则
迪米特法则
Demeter Principle
-
一个对象应该对其他对象保持最少的了解
-
类与类关系越密切,耦合度越大
-
迪米特法则(Demeter Principle)又叫最少知道原则,即一个类对自己依赖的类知道的 越少越好。也就是说,对于被依赖的类不管多么复杂,都尽量将逻辑封装在类的内 部。对外除了提供的public 方法,不对外泄露任何信息
-
迪米特法则还有个更简单的定义:只与直接的朋友通信
- 直接朋友:每个对象都会与其他对象有耦合关系,只要两个对象之间有耦合关系, 我们就说这两个对象之间是朋友关系。耦合的方式很多,依赖,关联,组合,聚合 等。其中,我们称出现成员变量,方法参数,方法返回值中的类为直接的朋友,而 出现在局部变量中的类不是直接的朋友。也就是说,陌生的类最好不要以局部变量 的形式出现在类的内部
-
迪米特法则的核心是降低类之间的耦合
-
但是注意:由于每个类都减少了不必要的依赖,因此迪米特法则只是要求降低 类间(对象间)耦合关系, 并不是要求完全没有依赖关系
package com.xin.principle;
import java.util.ArrayList;
import java.util.List;
//迪米特法则
public class DiMit {
public static void main(String[] args) {
//获取腾讯所有员工的id
TencentEmpManager tencentEmpManager = new TencentEmpManager();
tencentEmpManager.printAllEmp(new QQEmpManager());
}
}
//腾讯员工类
class TencentEmp {
private Integer id;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
@Override
public String toString() {
return "TencentEmp{" +
"id=" + id +
'}';
}
}
//qq员工类
class QQEmp {
private Integer id;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
@Override
public String toString() {
return "QQEmp{" +
"id=" + id +
'}';
}
}
//腾讯员工管理类
/*
对于这一个类来说,它的直接朋友是,TencentEmp,qqEmpManager
*/
class TencentEmpManager {
//获取到员工
public List<TencentEmp> getTencentEmp() {
List<TencentEmp> list = new ArrayList<TencentEmp>();
for (int i = 0; i < 5; i++) {
TencentEmp emp = new TencentEmp();
emp.setId(i);
list.add(emp);
}
return list;
}
//打印出所有员工的方法
void printAllEmp(QQEmpManager qqEmpManager) {
//打印腾讯的员工
List<TencentEmp> tencentEmps = this.getTencentEmp();
tencentEmps.stream().forEach(System.out::println);
//打印qq的员工
/*
迪米特法则:要求只与直接朋友腾讯,而在这一个类中QQEmp不是直接朋友,而是一个陌生的类
所以这里违背了迪米特法则
*/
// List<QQEmp> qqEmps = qqEmpManager.getQQEmp();
// qqEmps.stream().forEach(System.out::println);
//为了满足迪米特法则,这里获取qq员工的id,使用qq员工管理方法提供的方法来获取
qqEmpManager.printQQ();
}
}
//qq员工管理类
class QQEmpManager {
//获取到员工
public List<QQEmp> getQQEmp() {
List<QQEmp> list = new ArrayList<QQEmp>();
for (int i = 0; i < 3; i++) {
QQEmp qqEmp = new QQEmp();
qqEmp.setId(i);
list.add(qqEmp);
}
return list;
}
//打印qq员工id的方法
/*
满足迪米特法则的规范
对于被依赖的类不管多么复杂,都尽量将逻辑封装在类的内 部。对外除了提供的public 方法,不对外泄露任何信息
*/
public void printQQ() {
List<QQEmp> qqEmps = this.getQQEmp();
qqEmps.stream().forEach(System.out::println);
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构