迪米特法则
# 迪米特法则(Low of Demeter)
定义: 迪米特法则又叫最少知道原则,一个对象应该对其他对象保持对少的了解,从而保证类与类之间的松耦合;
迪米特原则强调只和朋友交流,即出现在成员变量,方法的输入、输出参数中的类称谓朋友类,而出现在方法内部的类则不属于朋友类;
## 举个例子
> 学校领导统计一名教职工在授的课程数量,类如如下👇

### Course 课程类
```text
public class Course {
}
```
### Employee 教职工
```text
public class Employee {
public void checkCourseCount(List<Course> courseList){
System.err.println("Course count :" + courseList.size() + " 个");
}
}
```
### TeamLeader 学校领导
```text
public class TeamLeader {
public void commandCheckCourseCount(Employee employee){
List<Course> courseList = new ArrayList<Course>();
for (int i = 0;i<20;i++){
courseList.add(new Course());
}
employee.checkCourseCount(courseList);
}
}
```
### DemoTest 测试类
```text
public class DemoTest {
public static void main(String[] args) {
TeamLeader teamLeader = new TeamLeader();
teamLeader.commandCheckCourseCount(new Employee());
}
}
```
通过上面的类图我们可以看到,学校领导去查看教职工有多少课程的时候,其实是不关心具体的课程的,也就是说领导类不需要和课程类耦合;
所以上面的教职工类需要做一下改造:
### TeamLeader改造类
```text
public class TeamLeader1 {
public void commandCheckCourseCount(Employee1 employee){
employee.checkCourseCount();
}
}
```
删除Leader与Course的耦合;
### Employee 改造类
```text
public class Employee1 {
public void checkCourseCount(){
List<Course> courseList = new ArrayList<>();
for (int i = 0;i<20;i++){
courseList.add(new Course());
}
System.err.println("Course count :" + courseList.size() + " 个");
}
}
```
教职工有多少在授课程,Employee1和Course两个类是直接耦合的;
修改之后的类图如下:

如图所示:TeamLeader与Course之间是没有关系的,这便符合了最少知道原则;
## 迪米特法则原则
- **降低了类之间的耦合度,提高模块的相对独立性;**
- **由于亲和度的降低,从而提高了类的可复用性和系统的扩展性**