本文主要是介绍迪米特法则原则,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
迪米特法则又称为最少知道原则,一个对象类对于其他类来说,知道的越少越好。两个类之间不要有过多的耦合,保持最少的关联,有内在联系的类要高内聚,没有直接关系的类应该低耦合。
未优化案例
例子里有老师、学生、校长三者,老师负责了解每一个学生的成绩而校长值关系班级总成绩和平均分,即班级的总体情况。
public class Student {private String name; // 学生姓名private int rank; // 考试排名(总排名)private double grade; // 考试分数(总分)public Student() {}public Student(String name, int rank, double grade) {this.name = name;this.rank = rank;this.grade = grade;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getRank() {return rank;}public void setRank(int rank) {this.rank = rank;}public double getGrade() {return grade;}public void setGrade(double grade) {this.grade = grade;}
}
public class Teacher {private String name; // 老师名称private String clazz; // 班级private static List<Student> studentList; // 学生public Teacher() {}public Teacher(String name, String clazz) {this.name = name;this.clazz = clazz;}static {studentList = new ArrayList<>();studentList.add(new Student("花花", 10, 589));studentList.add(new Student("豆豆", 54, 356));studentList.add(new Student("秋雅", 23, 439));studentList.add(new Student("皮皮", 2, 665));studentList.add(new Student("蛋蛋", 19, 502));}public static List<Student> getStudentList() {return studentList;}public String getName() {return name;}public String getClazz() {return clazz;}
}
public class Principal {private Teacher teacher = new Teacher("丽华", "3年1班");// 查询班级信息,总分数、学生人数、平均值public Map<String, Object> queryClazzInfo(String clazzId) {// 获取班级信息;学生总人数、总分、平均分int stuCount = clazzStudentCount();double totalScore = clazzTotalScore();double averageScore = clazzAverageScore();// 组装对象,实际业务开发会有对应的类Map<String, Object> mapObj = new HashMap<>();mapObj.put("班级", teacher.getClazz());mapObj.put("老师", teacher.getName());mapObj.put("学生人数", stuCount);mapObj.put("班级总分数", totalScore);mapObj.put("班级平均分", averageScore);return mapObj;}// 总分public double clazzTotalScore() {double totalScore = 0;for (Student stu : teacher.getStudentList()) {totalScore += stu.getGrade();}return totalScore;}// 平均分public double clazzAverageScore(){double totalScore = 0;for (Student stu : teacher.getStudentList()) {totalScore += stu.getGrade();}return totalScore / teacher.getStudentList().size();}// 班级人数public int clazzStudentCount(){return teacher.getStudentList().size();}}
从这个例子来看,老师只向校长提供了基本的信息,校长具体对数据进行统计分析。这样带来的缺点是校长需要对每个班级都进行统计分析,且如果有其他类型的角色需要拿到班级相关数据的话,又需要再次实现相关的代码功能,代码会变得臃肿,也不利于维护和扩展。
优化后的代码
public class Student {private String name; // 学生姓名private int rank; // 考试排名(总排名)private double grade; // 考试分数(总分)public Student() {}public Student(String name, int rank, double grade) {this.name = name;this.rank = rank;this.grade = grade;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getRank() {return rank;}public void setRank(int rank) {this.rank = rank;}public double getGrade() {return grade;}public void setGrade(double grade) {this.grade = grade;}
}
public class Teacher {private String name; // 老师名称private String clazz; // 班级private static List<Student> studentList; // 学生public Teacher() {}public Teacher(String name, String clazz) {this.name = name;this.clazz = clazz;}static {studentList = new ArrayList<>();studentList.add(new Student("花花", 10, 589));studentList.add(new Student("豆豆", 54, 356));studentList.add(new Student("秋雅", 23, 439));studentList.add(new Student("皮皮", 2, 665));studentList.add(new Student("蛋蛋", 19, 502));}// 总分public double clazzTotalScore() {double totalScore = 0;for (Student stu : studentList) {totalScore += stu.getGrade();}return totalScore;}// 平均分public double clazzAverageScore(){double totalScore = 0;for (Student stu : studentList) {totalScore += stu.getGrade();}return totalScore / studentList.size();}// 班级人数public int clazzStudentCount(){return studentList.size();}public String getName() {return name;}public String getClazz() {return clazz;}
}
public class Principal {private Teacher teacher = new Teacher("丽华", "3年1班");// 查询班级信息,总分数、学生人数、平均值public Map<String, Object> queryClazzInfo(String clazzId) {// 获取班级信息;学生总人数、总分、平均分int stuCount = teacher.clazzStudentCount();double totalScore = teacher.clazzTotalScore();double averageScore = teacher.clazzAverageScore();// 组装对象,实际业务开发会有对应的类Map<String, Object> mapObj = new HashMap<>();mapObj.put("班级", teacher.getClazz());mapObj.put("老师", teacher.getName());mapObj.put("学生人数", stuCount);mapObj.put("班级总分数", totalScore);mapObj.put("班级平均分", averageScore);return mapObj;}}
优化后,不论是谁都只需要调用老师类的相关方法就能获取到班级的情况,代码量减少了,只要保证老师类提供的数据正确,不用去每个类维护同样的代码。
参考资料:《重学Java设计模式》
这篇关于迪米特法则原则的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!