迪米特法则
迪米特法则表示一个对象应该对其他对象保持最少的了解。也就是说,一个类应该只和它的直接朋友交流,而不和它的间接朋友交流。直接朋友指的是成员变量、方法参数、方法返回值等类型的对象,间接朋友指的是局部变量、临时变量等类型的对象。
迪米特法则是面向对象设计的重要原则之一,它体现了类之间的松耦合和高内聚。如果一个软件能够遵循迪米特法则,那么它就具有以下两个优点:
- 降低了类之间的耦合性,提高了系统的可维护性。
- 隐藏了类之间的细节信息,提高了代码的可读性和安全性。
举个例子,假设我们有一个学校类 School,它有一个方法 printAllTeacherNames(),表示打印出所有老师的名字。然后我们定义了一个老师类 Teacher 和一个学生类 Student 来作为学校的成员。School 类依赖于 Teacher 类和 Student 类,代码如下:
代码语言:javascript复制class Teacher {
private String name;
public Teacher(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
class Student {
private String name;
public Student(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
class School {
private List<Teacher> teachers;
private List<Student> students;
public School(List<Teacher> teachers, List<Student> students) {
this.teachers = teachers;
this.students = students;
}
public void printAllTeacherNames() {
for (Teacher teacher : teachers) {
System.out.println(teacher.getName());
}
}
}
这个类违反了迪米特法则,因为它访问了 Teacher 类的内部信息,即 getName() 方法。这样的设计有以下几个缺点:
- 类之间的耦合度高,如果 Teacher 类发生变化,就需要修改 School 类的代码。
- 代码的可读性和安全性差,因为 School 类暴露了 Teacher 类的细节信息。
- 代码的灵活性差,如果我们想要打印出其他信息,比如老师的年龄、学历等,就需要修改 School 类和 Teacher 类的代码。
为了遵循迪米特法则,我们应该将 Teacher 类的 getName() 方法封装在 Teacher 类内部,并让 School 类只调用 Teacher 类的 printName() 方法。这样,在程序中可以让 School 类只和 Teacher 类交流,而不访问其内部信息。代码如下:
代码语言:javascript复制class Teacher {
private String name;
public Teacher(String name) {
this.name = name;
}
public void printName() {
System.out.println(name);
}
}
class Student {
private String name;
public Student(String name) {
this.name = name;
}
public void printName() {
System.out.println(name);
}
}
class School {
private List<Teacher> teachers;
private List<Student> students;
public School(List<Teacher> teachers, List<Student> students) {
this.teachers = teachers;
this.students = students;
}
public void printAllTeacherNames() {
for (Teacher teacher : teachers) {
teacher.printName();
}
}
}