迪米特法则(Law of Demeter,LoD) 也称最少知识原则
规则:一个对象应该对其他类有最少的了解
1.只和朋友交流
public class GroupLeader {
//有一个方法来实现清点
public void countStudents(List<GirlStudent> list) {
System.out.println("学生人数为:" + list.size());
}
}
public class MathTeacher{
// 老师发布命令 由 组长执行
// 清点女生人数
public void commond(GroupLeader student) {
List<GirlStudent> list = new ArrayList<>();
IntStream.range(1, 20).forEach(i -> list.add(new GirlStudent()));
// 执行这个任务需要组长来
student.countStudents(list);
}
}
public static void main(String[] args) {
MathTeacher t = new MathTeacher();
t.commond(new GroupLeader());
}
在上面的代码中,老师对女学生产生了依赖,而组长也对女学生产生了依赖
因为在MathTeacher中,GirlStudent这个类是在其行为中产生的依赖,所以这违反了迪米特法则
对其进行修改:
public interface Commond {
Object run();
}
public class CountCommond implements Commond{
private final List<GirlStudent> list;
private final GroupLeader g;
private CountCommond(List<GirlStudent> list, GroupLeader g) {
super();
this.list = list;
this.g = g;
}
public static Commond create(GroupLeader g,List<GirlStudent> list) {
return new CountCommond(list, g);
}
@Override
public Object run() {
System.out.println(g + "清点学生人数为:" + list.size());
return list.size();
}
}
public class MathTeacher{
public void commond(Commond c) {
c.run();
}
}
public static void main(String[] args) {
MathTeacher t = new MathTeacher();
List<GirlStudent> list = new ArrayList<>();
IntStream.range(1, 20).forEach(i -> list.add(new GirlStudent()));
t.commond(CountCommond.create(new GroupLeader(), list));
}
结构更加清晰:降低了藕合度,提高了可维护性