迪米特法则 (最少知道原则)
-
迪米特法则又叫最少知道原则,即一个类对自己依赖的类知道的越少越好。不管被依赖的类有多么的复杂,都尽量将逻辑封装在类的内部。除了提供 public 方法以外,不对外泄露其他信息
-
迪米特法则只与直接的朋友进行通信
直接朋友:
- 成员变量
- 方法参数
- 方法返回值
案例
案例需求描述:现在有一个老板、一个领导、十个员工。老板需要十个员工每天喊 “老板好”
public class Boss {
public void notice() {
Leader leader = new Leader(); // 应当将 Leader 提升为成员变量
List<Employee> employees = leader.getEmployees(); // 这里老板直接使用了员工类,员工是老板的下下级,应该由 Leader 来通知
employees.forEach(employee -> employee.say("老板好"));
}
}
public class Leader {
public List<Employee> getEmployees() {
List<Employee> employees = new ArrayList<>();
for (int i = 0; i < 10; i++) {
Employee employee = new Employee();
employee.setId(i + 1);
employees.add(employee);
}
return employees;
}
}
public class Employee {
private int id;
public void setId(int id) {
this.id = id;
}
public int getId() {
return id;
}
public void say(String str) {
System.out.println("员工" + this.id + "说: " + str);
}
}
public class Main {
public static void main(String[] args) {
Boss boss = new Boss();
boss.notice();
}
}
现在我们针对这个案例使用迪米特法则进行优化
优化思路:老板不需要知道每个员工信息,他也不需要单独对每个员工进行对话,他只需要吩咐给经理就行了。由经理做事情
public class Boss {
private final Leader leader = new Leader();
public void notice() {
leader.notice("老板好");
}
}
public class Leader {
public List<Employee> getEmployees() {
List<Employee> employees = new ArrayList<>();
for (int i = 0; i < 10; i++) {
Employee employee = new Employee();
employee.setId(i + 1);
employees.add(employee);
}
return employees;
}
public void notice(String str) {
this.getEmployees().forEach(employee -> employee.say("老板好"));
}
}
Main 和 Employee 类不需要进行修改
通过迪米特法则优化后可以看出 Boss 与员工没有了直接的接触了
ps: 我对迪米特法则的理解就是,依赖应该有层次,一级只能依赖一级,不能跨级依赖。换个比方就是,老板不需要知道每个员工做什么,只需要管理他的下一级
网友评论