迪米特法则(Law of Demeter,LoD)描述的是一个规则:一个对象应该对其它对象有最少的了解。迪米特法则的实际意义就是实现类内部的高内聚,类之间的低耦合。迪米特法则对类的低耦合提出明确的要求,其包含以下含义:
只和朋友类交流。
什么是直接的朋友类?每个对象都必然会与其他对象有耦合关系,两个对象之间的耦合就成为朋友关系,这种关系的类型有很多,例如组合、聚合、依赖。朋友类的定义如下:出现在成员变量、方法的输入输出参数中的类称为成员朋友类,而出现在方法体内部的类不属于朋友类。案例:
定义一个教师类,从迪米特法则来看,Teacher类中,GroupLeader是属于朋友类,因为它们通过方法的输入输出参数来成为朋友类的。
public class Teacher{
public void commond(GroupLeader groupLeader){
List<Gril> listGirls = new ArrayList();
for (int i=0; i<20; i++){
listGirls.add(new Gril());
}
groupLeader.countGrils(listGirls);
}
}
public void commond(GroupLeader groupLeader){
List<Gril> listGirls = new ArrayList();
for (int i=0; i<20; i++){
listGirls.add(new Gril());
}
groupLeader.countGrils(listGirls);
}
}
而Gril这个类是出现在commond方法体内,因此不属于Teacher类的朋友类,这样就破坏了Teacher的健壮性。因为方法是类的一个行为,类竟然不知道自己的行为与其它类产生依赖关系,这是违反迪米特法则的。造成了Teacher和Girl两个类之间的高耦合。
public class GroupLeader{
public void countGrils(List<Gril> listGirls){
System.out.println("女生数量是:"+listGirls.size());
}
}
public void countGrils(List<Gril> listGirls){
System.out.println("女生数量是:"+listGirls.size());
}
}
将以上的代码进行修改,以符合迪米特法则。首先将Girl类从Teacher类的commond方法移除。
public class Teacher {
public void commond(GroupLeader groupLeader){
groupLeader.countGirls();
}
}
public void commond(GroupLeader groupLeader){
groupLeader.countGirls();
}
}
修改GroupLeader类,将Gril类做为成员变量。
public class GroupLeader{
private List<Gril> listGirls;
public GroupLeader(List<Girl> _listGirls){
this.listGirls = _listGirls;
}
public void countGirls(){
System.out.println()("女生数量是:"+this.listGirls.size())
}
}
private List<Gril> listGirls;
public GroupLeader(List<Girl> _listGirls){
this.listGirls = _listGirls;
}
public void countGirls(){
System.out.println()("女生数量是:"+this.listGirls.size())
}
}
把List<Girl>的初始化移动到场景类中,同时在GroupLeader中增加对Gril的注入,避开Teacher类对陌生类Gril的访问,降低系统之间的耦合。
public class Client{
public static void main(String[] args){
//产生一个女生群体
List<Girl> listGirls = new ArrayList<Girl>();
//初始化Gril的值
for (int i=0; i<20;i++){
listGirls.add(new Girl());
}
Teacher teacher = new Teacher();
teacher.commond(new GroupLeader(listGirls));
}
}
public static void main(String[] args){
//产生一个女生群体
List<Girl> listGirls = new ArrayList<Girl>();
//初始化Gril的值
for (int i=0; i<20;i++){
listGirls.add(new Girl());
}
Teacher teacher = new Teacher();
teacher.commond(new GroupLeader(listGirls));
}
}