迪米特法则(Law of Demeter)又称为最少知识原则(Principle of Least Knowledge),是面向对象设计中的一个重要原则之一。该原则强调一个对象应该对其他对象尽可能少地了解,即一个对象应该与其它对象之间保持松耦合,尽量减少对象之间的交互,从而降低系统的复杂度、提高模块的可复用性和可维护性。
迪米特法则的基本思想可以用一句话总结:只与直接的朋友通信。其中,“朋友”指的是以下几种对象:
- 当前对象本身
- 当前对象的成员变量
- 作为方法参数传递进来的对象
- 当前方法中创建的对象
- 对象的组件(例如,对象的属性中包含的其他对象)
下面分别给出一个违反迪米特法则的反例和一个符合迪米特法则的正例,用Java代码来说明。
反例:
class Manager {
private Team team;
public Manager(Team team) {
this.team = team;
}
public void manage() {
// 反例:Manager 与 Team 之外的对象(如Employee)直接通信
List<Employee> employees = team.getEmployees();
for (Employee employee : employees) {
employee.doWork();
}
}
}
class Team {
private List<Employee> employees;
public Team(List<Employee> employees) {
this.employees = employees;
}
public List<Employee> getEmployees() {
return employees;
}
}
class Employee {
public void doWork() {
// 做一些工作
}
}
在这个反例中,Manager 类违反了迪米特法则,因为它直接与 Team 类的内部细节交互,而且 Team 类内部包含了 Employee 的具体实现。这导致了 Manager 类对 Team 类和 Employee 类的耦合性较高。
正例:
class Manager {
private Team team;
public Manager(Team team) {
this.team = team;
}
public void manage() {
// 正例:Manager 仅与 Team 对象直接通信
team.work();
}
}
class Team {
private List<Employee> employees;
public Team(List<Employee> employees) {
this.employees = employees;
}
public void work() {
for (Employee employee : employees) {
employee.doWork();
}
}
}
class Employee {
public void doWork() {
// 做一些工作
}
}
在这个正例中,Manager 类遵循了迪米特法则,因为它只与 Team 类直接通信,而不涉及 Team 内部的细节。这样可以有效降低 Manager 类与其他类的耦合性,提高代码的灵活性和可维护性。