迪米特法则(Law of Demeter, LoD)
一个软件实体应当尽可能少地与其他实体发生相互作用
注意
那么当其中某一个模块发生修改时,就会尽量少地影响其他模块,扩展会相对容易,这是对软件实体之间通信的限制,迪米特法则要求限制软件实体之间通信的宽度和深度。迪米特法则可降低系统的耦合度,使类与类之间保持松散的耦合关系。
在类的创建上尽量创建松耦合的类,类之间耦合越低,越容易重复利用,一个处在松耦合中的类一旦被修改,不会对关联的类造成太大波及;在类的结构设计上,每一个类都应当尽量降低其成员变量和成员函数的访问权限;在类的设计上,只要有可能,一个类型应当设计成不变类;在对其他类的引用上,一个对象对其他对象的引用应当降到最低。
只与你的”直接朋友”通信
当前对象本身(this);
以参数形式传入到当前对象方法中的对象
当前对象的成员对象;
如果当前对象的成员对象是一个集合,那么集合中的元素也都是朋友;
当前对象所创建的对象。
问题 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 public class Student { private String id; public void setId (String id) { this .id = id; } public String getId () { return id; } } public class Teacher { private String id; public void setId (String id) { this .id = id; } public String getId () { return id; } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 public class StudentManager { public List<Student> getAllStudent () { List<Student> list = new ArrayList<>(); for (int i=0 ; i<100 ; i++){ Student emp = new Student(); emp.setId("学生" +i); list.add(emp); } return list; } } public class TeacherManager { public List<Teacher> getAllTeacher () { List<Teacher> list = new ArrayList<>(); for (int i=0 ; i<30 ; i++){ Teacher emp = new Teacher(); emp.setId("老师" +i); list.add(emp); } return list; } public void printAllStudentAndTeacher (StudentManager studentManager) { List<Student> list1 = studentManager.getAllStudent(); for (Student e:list1){ System.out.println(e.getId()); } List<Teacher> list2 = this .getAllTeacher(); for (Teacher e:list2){ System.out.println(e.getId()); } } }
1 2 3 4 5 6 public class Main { public static void main (String[] args) { TeacherManager e = new TeacherManager(); e.printAllStudentAndTeacher(new StudentManager()); } }
根据迪米特法则,只与直接的朋友发生通信,TeacherManager里面不应该有学生有联系,这样就增加了不必要的耦合。
修改 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 public class StudentManager { public List<Student> getAllStudent () { List<Student> list = new ArrayList<>(); for (int i=0 ; i<100 ; i++){ Student emp = new Student(); emp.setId("学生" +i); list.add(emp); } return list; } public void printStudent () { List<Student> list = this .getAllStudent(); for (Student e:list){ System.out.println(e.getId()); } } }
1 2 3 4 5 6 7 8 public class Main { public static void main (String[] args) { TeacherManager e = new TeacherManager(); e.printTeacher(); StudentManager s = new StudentManager(); s.printStudent(); } }
六大设计原则:
上一篇:设计模式六原则 - 里氏替换原则
下一篇:设计模式六原则 - 开闭原则