迪米特法则

# 迪米特法则(Low of Demeter) 定义: 迪米特法则又叫最少知道原则,一个对象应该对其他对象保持对少的了解,从而保证类与类之间的松耦合; 迪米特原则强调只和朋友交流,即出现在成员变量,方法的输入、输出参数中的类称谓朋友类,而出现在方法内部的类则不属于朋友类; ## 举个例子 > 学校领导统计一名教职工在授的课程数量,类如如下👇 ![](https://oscimg.oschina.net/oscnet/up-cef146258000a9d4fc4a44b05cf6fd867ca.png) ### 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两个类是直接耦合的; 修改之后的类图如下: ![](https://oscimg.oschina.net/oscnet/up-6e2ca066e0d73a3327e27b456ba73815e6f.png) 如图所示:TeamLeader与Course之间是没有关系的,这便符合了最少知道原则; ## 迪米特法则原则 - **降低了类之间的耦合度,提高模块的相对独立性;** - **由于亲和度的降低,从而提高了类的可复用性和系统的扩展性**