迪米特法则是面向对象设计中的一个原则,它的目标是减少对象之间的直接依赖关系,它强调一个对象应该尽量减少与其他对象之间的直接交互,只与自己的直接朋友进行通信,(所谓对象之间的朋友关系就是耦合关系,耦合的方式有很多:依赖、关联、组合,聚合等等。我们称出现成员变量,方法参数,方法返回值中的类为直接朋友,而出现在局部变量中的类不是直接朋友),这样可以避免一个对象过度了解其他对象的内部结构,从而减少代码的耦合性和依赖性,提高代码的可维护性,降低系统的复杂性,并且方便进行单元测试和重构。
举例:
我们分别创建student,class,school,student和class之间建立直接朋友关系,school和class之间建立直接朋友关系,而student和school之间并没交互关系,减少了类之间的耦合度
package druidResources; import java.util.ArrayList; import java.util.List; // 学生类 class Student { private String name; public Student(String name) { this.name = name; } public String getName() { return name; } } // 班级类 class Class { //实现班级和学生交互 private List<Student> students; public Class() { students = new ArrayList<>(); } public void addStudent(Student student) { students.add(student); } public List<Student> getStudents() { return students; } } // 学校类 class School { //实现班级和学校交互 private List<Class> classes; public School() { classes = new ArrayList<>(); } public void addClass(Class clazz) { classes.add(clazz); } // 获取学校中所有学生的姓名 public List<String> getAllStudentNames() { List<String> names = new ArrayList<>(); for (Class clazz : classes) { for (Student student : clazz.getStudents()) { names.add(student.getName()); } } return names; } } public class LawOfDemeter { public static void main(String[] args) { // 创建学校对象 School school = new School(); // 创建班级对象 Class class1 = new Class(); Class class2 = new Class(); // 创建学生对象 Student student1 = new Student("张三"); Student student2 = new Student("李四"); Student student3 = new Student("王五"); // 添加学生到班级 class1.addStudent(student1); class1.addStudent(student2); class2.addStudent(student3); // 添加班级到学校 school.addClass(class1); school.addClass(class2); // 获取学校中所有学生的姓名 List<String> names = school.getAllStudentNames(); // 打印学生姓名 for (String name : names) { System.out.println(name); } } }
输出:
张三 李四 王五