迪米特法则
定义:一个对象应该对其他对象了解最少
迪米特法则的核心观念就是类间解耦,弱耦合,只有弱耦合了以后,类的复用性才可以提高。
迪米特法则的初衷在于降低类之间的耦合。由于每个类尽量减少对其他类的依赖,因此,很容易使得系统的功能模块功能独立,相互之间不存在(或很少有)依赖关系。
迪米特法则不希望类直接建立直接的接触。如果真的有需要建立联系,也希望能通过它的友元类来转达。因此,应用迪米特法则有可能造成的一个后果就是:系统中存在大量的中介类,这些类之所以存在完全是为了传递类之间的相互调用关系——这在一定程度上增加了系统的复杂度。
这里我们用到设计之禅中的一个例子,老师想知道班里面的女人数,就让体育委员去清点女生的人数。
Girl类
public class Girl {
}
Teacher类
public class Teacher {
public void commond(GroupLeader groupLeader){
List<Girl> listGirls=new ArrayList();
for(int i=0;i<20;i++)
listGirls.add(new Girl());
groupLeader.countGirls(listGirls);
}
}
GroupLeader类
public class GroupLeader {
public void countGirls(List<Girl> listGirls){
System.out.println("女生数量是:"+listGirls.size());
}
}
测试实例
public class testdemo {
public static void main(String arg[]){
Teacher teacher=new Teacher();
teacher.commond(new GroupLeader());
}
}
结果
女生数量是:20
这里就有一个严重的问题在Teacher类中,按照道理说老师只需要发布一个命令给体育委员,其他的工作都应该体育委员来实现工作,但是这个例子中老师负责的东西太多,对于程序的扩张性很不好。一个相对较好的方法就是,老师发布命令给体育委员让其查女生数量,然后体育委员去遍历女生的个数。
同样的Girl类
public class Girl {
}
Teacher类
public class Teacher {
public void commond(GroupLeader groupLeader){
groupLeader.countGirls();
}
}
GroupLeader类
public class GroupLeader {
private List<Girl> listGirls;
public GroupLeader(List<Girl> listGirls){
this.listGirls=listGirls;
}
public void countGirls(){
System.out.println("女生数量是:"+this.listGirls.size());
}
}
测试实例
public class testdemo {
public static void main(String arg[]){
List<Girl> listGirls=new ArrayList<Girl>();
for(int i=0;i<20;++i)
listGirls.add(new Girl());
Teacher teacher =new Teacher();
teacher.commond(new GroupLeader(listGirls));
}
}
结果
女生数量是:20
这样老师就不需要知道班级女生的情况,他只需要知道体育委员就可以,给体育委员一个命令,体育委员根据老师的命令然后去接触女生这个群体计算结果。而女生群体在测试的时候再实现,这样是程序更加简洁稳健。
关于应用迪米特法则的注意事项:
① 在类的划分上,应该创建有弱耦合的类;
② 在类的结构设计上,每一个类都应当尽量降低成员的访问权限;
③ 在类的设计上,只要有可能,一个类应当设计成不变类;
④ 在对其他类的引用上,一个对象对其它对象的引用应当降到最低;
⑤ 尽量降低类的访问权限;
⑥ 谨慎使用序列化功能;
⑦ 不要暴露类成员,而应该提供相应的访问器(属性)。