迪米特法则是面向对象设计中的一个原则,它的目标是减少对象之间的直接依赖关系,它强调一个对象应该尽量减少与其他对象之间的直接交互
,只与自己的直接朋友进行通信
,(所谓对象之间的朋友关系就是耦合关系
,耦合的方式有很多:依赖、关联、组合,聚合等等。我们称出现成员变量,方法参数,方法返回值中的类为直接朋友
,而出现在局部变量中的类不是直接朋友
),这样可以避免一个对象过度了解其他对象的内部结构,从而减少代码的耦合性和依赖性,提高代码的可维护性,降低系统的复杂性,并且方便进行单元测试和重构。
举例:
我们分别创建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);
}
}
}
输出:
张三
李四
王五