迪米特法则(Law of Demeter,LoD)也称为最少知识原则(Least Knowledge Principle,LKP)
问题由来:类与类之间的关系越密切,耦合度越大,当一个类发生改变时,对另一个类的影响也越大
一个对象应该对其他对象有最少的了解。通俗地讲,一个类应该对自己需要耦合或调用的类知道得最少,你(被耦合或调用的类)的内部是如何复杂都和我没关系,那是你的事情,我就知道你提供的public方法,我就调用这么多,其他的一概不关心
含义:只和朋友交流 ,朋友类的定义是这样的:出现在成员变量、方法的输入输出参数中的类称为成员朋友类,而出现在方法体内部的类不属于朋友类,意思是在一个类中如果出现另一个类,这个类可以定义为成员变量,或者通过形参传递过来,但是不能再方法体中,比如下面的代码就不是按照迪迷特法则来的,'
public class Teacher {
public void commond(GroupLeader groupLeader) {
List<Girl> listGirls = new ArrayList<Girl>();
for (int i = 0; i < 20; i++) {
listGirls.add(new Girl());
}
groupLeader.countGirls(listGirls);
}
}
方法是类的一个行为,类竟然不知道自己的行为与其他类产生了依赖关系,这是不允许的
说明:因为Teacher这个类中的方法commond()有业务逻辑在,而引入了Girl这个类,这个就不符合迪米特法则了,它的业务逻辑应该直接放在GroupLeader 中做,我们应该把
List<Girl> listGirls = new ArrayList<Girl>();
for (int i = 0; i < 20; i++) {
listGirls.add(new Girl());
}
这段代码应该封装在GroupLeader 类中内部实现,
public class GroupLeader {
private List<Girl> listGirls;
public GroupLeader(List<Girl> _listGirls) {
this.listGirls = _listGirls;
}
public void countGirls() {
System.out.println("女生数量是:" + listGirls.size());
}
}
这样改完后GroupLeader 提供了countGirds()方法,而不需要关心里面的实现,别人也没法通过改动 把你这块逻辑改掉,