定义:一个对象应该对其它对象保持最少的了解,又叫最少知道原则。
尽量降低类和类之间的解耦。
优点:降低类之间的耦合。
强调只和朋友交流,不和陌生人说话。这里的朋友指的是,出现在成员变量、方法的输入、输出参数中的类,而出现在方法体内部的类不属于朋友类。
案例:
此处以课程为例,假如老板想让teamleader查一下目前网站上在售的课程数量,V1版本的代码如下
public class Course { }
public class TeamLeader { public void checkNumberOfCourses(List<Course> courseList){ System.out.println("在线课程的数量是:"+courseList.size()); } }
public class Boss { public void commandCheckNumber(TeamLeader teamLeader){ List<Course> courseList = new ArrayList<Course>(); for(int i =0; i < 20; i++) { courseList.add(new Course()); } teamLeader.checkNumberOfCourses(courseList); } }
public class Test { public static void main(String[] args) { Boss boss = new Boss(); TeamLeader teamLeader = new TeamLeader(); boss.commandCheckNumber(teamLeader); } }
迪米特原则强调类只跟朋友说话,在Boss这个类中,commandCheckNumber方法入参teamLearder是Boss的朋友,方法内部出现了Course类不是Boss的朋友,所以不符合迪米特原则,Boss不需要知道teamLeader的具体实现,不需要跟Course进行交流,只需要下达指令由teamLeader进行具体的实现即可。
V2版本的代码如下
public class TeamLeader { public void checkNumberOfCourses(){ List<Course> courseList = new ArrayList<Course>(); for(int i = 0 ;i < 20;i++){ courseList.add(new Course()); } System.out.println("在线课程的数量是:"+courseList.size()); } }
public class Boss { public void commandCheckNumber(TeamLeader teamLeader){ teamLeader.checkNumberOfCourses(); } }
调整之后的代码,Boss不需要了解具体的实现,只需要给朋友 teamLeader下指令即可,也不需要知道course。
迪米特原则,最重要的是要能区分出哪些类是直接的朋友,哪些类不是朋友,尽量做到弱耦合,提高类的复用率,同时在日常的开发中要适度,否则可能会产生大量的中介类,导致类的结构复杂,带来了维护的难度。