设计模式六原则 - 迪米特法则

迪米特法则(Law of Demeter, LoD)

一个软件实体应当尽可能少地与其他实体发生相互作用

注意

  • 那么当其中某一个模块发生修改时,就会尽量少地影响其他模块,扩展会相对容易,这是对软件实体之间通信的限制,迪米特法则要求限制软件实体之间通信的宽度和深度。迪米特法则可降低系统的耦合度,使类与类之间保持松散的耦合关系。

  • 在类的创建上尽量创建松耦合的类,类之间耦合越低,越容易重复利用,一个处在松耦合中的类一旦被修改,不会对关联的类造成太大波及;在类的结构设计上,每一个类都应当尽量降低其成员变量和成员函数的访问权限;在类的设计上,只要有可能,一个类型应当设计成不变类;在对其他类的引用上,一个对象对其他对象的引用应当降到最低。

  • 只与你的”直接朋友”通信

    • 当前对象本身(this);
    • 以参数形式传入到当前对象方法中的对象
    • 当前对象的成员对象;
    • 如果当前对象的成员对象是一个集合,那么集合中的元素也都是朋友;
    • 当前对象所创建的对象。

问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class Student {
private String id;
public void setId(String id){
this.id = id;
}
public String getId(){
return id;
}
}

public class Teacher {
private String id;
public void setId(String id){
this.id = id;
}
public String getId(){
return id;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
public class StudentManager {
public List<Student> getAllStudent(){
List<Student> list = new ArrayList<>();
for(int i=0; i<100; i++){
Student emp = new Student();
emp.setId("学生"+i);
list.add(emp);
}
return list;
}
}

public class TeacherManager {
public List<Teacher> getAllTeacher(){
List<Teacher> list = new ArrayList<>();
for(int i=0; i<30; i++){
Teacher emp = new Teacher();
emp.setId("老师"+i);
list.add(emp);
}
return list;
}

public void printAllStudentAndTeacher(StudentManager studentManager){
List<Student> list1 = studentManager.getAllStudent();
for(Student e:list1){
System.out.println(e.getId());
}

List<Teacher> list2 = this.getAllTeacher();
for(Teacher e:list2){
System.out.println(e.getId());
}
}
}
1
2
3
4
5
6
public class Main {
public static void main(String[] args){
TeacherManager e = new TeacherManager();
e.printAllStudentAndTeacher(new StudentManager());
}
}

根据迪米特法则,只与直接的朋友发生通信,TeacherManager里面不应该有学生有联系,这样就增加了不必要的耦合。

修改

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class StudentManager {
public List<Student> getAllStudent(){
List<Student> list = new ArrayList<>();
for(int i=0; i<100; i++){
Student emp = new Student();
emp.setId("学生"+i);
list.add(emp);
}
return list;
}

public void printStudent(){
List<Student> list = this.getAllStudent();
for(Student e:list){
System.out.println(e.getId());
}
}
}
1
//老师同上
1
2
3
4
5
6
7
8
public class Main {
public static void main(String[] args){
TeacherManager e = new TeacherManager();
e.printTeacher();
StudentManager s = new StudentManager();
s.printStudent();
}
}

六大设计原则:

当前网速较慢或者你使用的浏览器不支持博客特定功能,请尝试刷新或换用Chrome、Firefox等现代浏览器