迪米特法则
定义
迪米特法则(Law of Demeter, LoD)是1987年秋天由lan holland在美国东北大学一个叫做迪米特的项目设计提出的,它要求一个对象应该对其他对象有最少的了解,所以迪米特法则又叫做最少知识原则(Least Knowledge Principle, LKP)。
意义
迪米特法则的意义在于降低类之间的耦合。由于每个对象尽量减少对其他对象的了解,因此,很容易使得系统的功能模块功能独立,相互之间不存在(或很少有)依赖关系。
值得一提的是,这一法则却不仅仅局限于计算机领域,在其他领域也同样适用。比如,美国人就在航天系统的设计中采用这一法则。
实践
1.只和直接的朋友交流;2.减少对朋友的了解。下面就详细说说如何做到这两点。
我们举一个例子说明什么是朋友,什么是直接的朋友。很简单的例子:老师让班长清点全班同学的人数。这个例子中总共有三个类:老师Teacher、班长ClassLeader和学生Student。
package demitDemo; import java.util.ArrayList; public class Teacher {//教师类 public void command(ClassLeader classleader) { ArrayList<String> list = new ArrayList<>(); for(int i=0;i<40;i++) { Student student = new Student(); student.setName("学生"+i); list.add(student.getName()); } ClassLeader.order(list); } }
package demitDemo; import java.util.ArrayList; public class ClassLeader {//班长类 public static void order(ArrayList<String> getAllName) { for(int i=0;i<40;i++) { System.out.println(getAllName.get(i)); } } }
package demitDemo; public class Student {//学生类 private String name; public void setName(String name) { this.name = name; } public String getName() { return name; } }
package demitDemo; public class Client { public static void main(String[] args) { Teacher teacher = new Teacher(); ClassLeader classleader = new ClassLeader(); teacher.command(classleader); } }
在这个例子中,我们的Teacher有几个朋友?两个,一个是GroupLeader,因为它是Teacher的command:方法的输入参数;另一个是Student,因为在Teacher的command:方法体中使用了Student。
那么我们的Teacher有几个是直接的朋友?按照直接的朋友的定义“出现在成员变量、方法的输入输出参数中的类就是直接的朋友”,只有GroupLeader是Teacher的直接的朋友。Teacher在command方法中创建了
Student的集合,和非直接的朋友Student发生了交流,所以,上述例子违反了迪米特法则。方法是类的一个行为,类竟然不知道自己的行为与其他的类产生了依赖关系,这是不允许的,严重违反了迪米特法则!
package demitDemo; import java.util.ArrayList; public class ClassLeader {//班长类 public static void order() { ArrayList<String> getAllName = new ArrayList<>(); for(int i=0;i<40;i++) { Student student = new Student(); student.setName("学生"+i); getAllName.add(student.getName()); } for(int j=0;j<40;j++) { System.out.println(getAllName.get(j)); } } }
package demitDemo; import java.util.ArrayList; public class Teacher { //教师类 public void command(ClassLeader classleader) { classleader.order(); } }
这样修改后,每个类都只和直接的朋友交流,有效减少了类之间的耦合。

浙公网安备 33010602011771号