元素码农
基础
UML建模
数据结构
算法
设计模式
网络
TCP/IP协议
HTTPS安全机制
WebSocket实时通信
数据库
sqlite
postgresql
clickhouse
后端
rust
go
java
php
mysql
redis
mongodb
etcd
nats
zincsearch
前端
浏览器
javascript
typescript
vue3
react
游戏
unity
unreal
C++
C#
Lua
App
android
ios
flutter
react-native
安全
Web安全
测试
软件测试
自动化测试 - Playwright
人工智能
Python
langChain
langGraph
运维
linux
docker
工具
git
svn
🌞
🌙
目录
▶
设计原则
单一职责原则
开闭原则
里氏替换原则
依赖倒置原则
接口隔离原则
迪米特法则
▶
创建型模式
工厂方法模式
抽象工厂
单例模式
建造者模式
原型模式
▶
结构型模式
适配器模式
装饰器模式
代理模式
外观模式
组合模式
桥接模式
享元模式
▶
行为型模式
策略模式
观察者模式
命令模式
模板方法模式
状态模式
责任链模式
迭代器模式
中介者模式
访问者模式
备忘录模式
解释器模式
发布时间:
2025-03-21 10:57
↑
☰
# 迪米特法则 (Law of Demeter) ## 定义 迪米特法则(LoD),也称为最少知识原则(Least Knowledge Principle),它规定一个对象应该对其他对象有最少的了解。一个对象应该只与它的直接朋友交谈。 ## 为什么需要迪米特法则 - 降低系统的耦合度 - 提高系统的可维护性 - 降低系统的复杂度 - 提高代码的可读性 ## 示例说明 ### 违反迪米特法则的例子 ```go // 违反LoD的设计 type Company struct { manager *Manager } type Manager struct { employees []Employee } type Employee struct { name string } // Company直接访问Employee,违反了迪米特法则 func (c *Company) printEmployeeNames() { for _, employee := range c.manager.employees { fmt.Println(employee.name) } } ``` 这个设计的问题在于: 1. Company直接访问了Employee的细节 2. Company与Employee产生了不必要的依赖 3. 增加了类之间的耦合 ### 遵循迪米特法则的设计 ```go // 重构后的设计 type Company struct { manager *Manager } type Manager struct { employees []Employee } type Employee struct { name string } // Manager提供获取员工名字的方法 func (m *Manager) getEmployeeNames() []string { var names []string for _, employee := range m.employees { names = append(names, employee.name) } return names } // Company通过Manager获取员工信息 func (c *Company) printEmployeeNames() { names := c.manager.getEmployeeNames() for _, name := range names { fmt.Println(name) } } ``` ## 如何遵循迪米特法则 1. 只与直接的朋友通信 - 直接朋友包括:成员变量、方法参数、方法返回值中的类 - 避免和陌生的类发生直接联系 2. 减少对象之间的联系 - 使用中间类来降低耦合度 - 避免在一个方法中调用多个对象的方法 3. 封装细节 - 对外提供必要的接口 - 隐藏内部实现细节 ## 最佳实践 1. 在类的设计上,应该创建弱耦合的类 2. 在类的结构上,尽量降低类成员的访问权限 3. 在类的调用上,避免创建不必要的交互 4. 使用中间类来降低耦合度 ## 优缺点 ### 优点 - 降低了类之间的耦合度 - 提高了类的可复用性 - 提高了系统的可维护性 - 降低了类之间的依赖关系 ### 缺点 - 可能产生大量的中间类 - 增加了系统的复杂度 - 可能会影响系统的性能 ## 总结 迪米特法则是一个用来降低类之间耦合度的原则。它要求我们在设计系统时,应该尽量减少对象之间的交互,只保留必要的交互。这样可以使系统更加灵活,更易于维护和扩展。 ## 实践建议 1. 在设计类时,要注意类之间的依赖关系 2. 尽量减少对象之间的直接交互 3. 合理使用中间类来降低耦合 4. 谨慎处理类之间的关系,不要过度使用"朋友"关系