定义:是指一个对象类对于其他对象类来说,知道的越少越好。也就是说两个类之间不要有过多的耦合关系,保持最少关联性。

经典语录:只和朋友通信,不合陌生人说话。

也就是说有内在关联的类要内聚,没有直接关系的类要低耦合。

原始方法代码实现:

public class Principal {private Teacher teacher = new Teacher("梨花","三年级一班");//查询班级信息、总分、学生人数、平均分public Map<String,Object> queryClassInfo(){//获取班级信息:学生人数、总分、平均分//学生人数int stuCount = clazzStudentCount();//班级总成绩double totalScore = clazzTotalScore();//班级平均成绩double averageScore = clazzAgerageScore();//组装对象,实际开发过程中会有对应的类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;}private double clazzAgerageScore() {double totalScore = 0;for (Student stu : Teacher.getStudentList()) {totalScore += stu.getGrade();}return totalScore / Teacher.getStudentList().size();}private double clazzTotalScore() {double totalScore = 0;for (Student stu : Teacher.getStudentList()) {totalScore += stu.getGrade();}return totalScore;}private int clazzStudentCount() {return Teacher.getStudentList().size();}/*** 以上实现方法虽然简单可用,但是违背了迪米特法则,因为校长需要了解到每个学生的情况,* 如果所有班级都让校长统计的话,代码就会显得非常的臃肿,不利于维护和扩展*/
}
public class Student {private String name; //学生姓名private int rank; //考试排名private double grade; // 总分public Student(String name, int rank, double grade) {this.name = name;this.rank = rank;this.grade = grade;}public String getName() {return name;}public Student setName(String name) {this.name = name;return this;}public int getRank() {return rank;}public Student setRank(int rank) {this.rank = rank;return this;}public double getGrade() {return grade;}public Student setGrade(double grade) {this.grade = grade;return this;}
}
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,580));studentList.add(new Student("豆豆",54 , 356));studentList.add(new Student("秋雅",23 , 500));studentList.add(new Student("屁屁",5 , 600));studentList.add(new Student("吉吉",2 , 655));}public String getName() {return name;}public Teacher setName(String name) {this.name = name;return this;}public String getClazz() {return clazz;}public Teacher setClazz(String clazz) {this.clazz = clazz;return this;}public static List<Student> getStudentList() {return studentList;}public static void setStudentList(List<Student> studentList) {Teacher.studentList = studentList;}
}

迪米特法则原理代码实现:

public class Principal {private Teacher teacher = new Teacher("梨花","三年级一班");//查询班级信息、总分、学生人数、平均分public Map<String,Object> queryClassInfo(){//获取班级信息:学生人数、总分、平均分//学生人数int stuCount = teacher.clazzStudentCount();//班级总成绩double totalScore = teacher.clazzTotalScore();//班级平均成绩double averageScore = teacher.clazzAgerageScore();//组装对象,实际开发过程中会有对应的类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 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,580));studentList.add(new Student("豆豆",54 , 356));studentList.add(new Student("秋雅",23 , 500));studentList.add(new Student("屁屁",5 , 600));studentList.add(new Student("吉吉",2 , 655));}//平均分public double clazzAgerageScore() {double totalScore = 0;for (Student stu : com.yangtingjia.design_ruler.dimite.origin.Teacher.getStudentList()) {totalScore += stu.getGrade();}return totalScore / com.yangtingjia.design_ruler.dimite.origin.Teacher.getStudentList().size();}//总分public double clazzTotalScore() {double totalScore = 0;for (Student stu : com.yangtingjia.design_ruler.dimite.origin.Teacher.getStudentList()) {totalScore += stu.getGrade();}return totalScore;}//学生人数public int clazzStudentCount() {return com.yangtingjia.design_ruler.dimite.origin.Teacher.getStudentList().size();}public String getName() {return name;}public Teacher setName(String name) {this.name = name;return this;}public String getClazz() {return clazz;}public Teacher setClazz(String clazz) {this.clazz = clazz;return this;}public static List<Student> getStudentList() {return studentList;}public static void setStudentList(List<Student> studentList) {Teacher.studentList = studentList;}
}

迪米特法则原理(最少知道原则)相关推荐

  1. 迪米特法则(最少知道原则)

    10.3.5  迪米特法则(最少知道原则)(Demeter Principle) 迪米特法则(Law of Demeter)又叫最少知道原则(Least Knowledge Principle),19 ...

  2. 迪米特法则(最少知识原则)

    定义 如果两个类不必彼此直接通信,那么这两个类就不应该发生直接的相互作用.如果一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个应用. 迪米特法则强调:在类的结构设计上,每一个类都应该尽量 ...

  3. 2016-12-28 迪米特法则+依赖倒转原则+里氏替换原则

    依赖倒转原则 依赖倒转原则,也翻译成依赖倒置原则,抽象不应该依赖细节,细节应该依赖于抽象,要针对接口编程,而不是对实现编程.如电脑中无论主板.CPU.内存.硬盘都是针对接口设计的,PC电脑硬件的发展, ...

  4. 面向对象软件设计原则【JAVA】(开闭原则、里氏代换、依赖倒转、接口隔离、迪米特法则、合成复用原则)

    软件设计原则[JAVA](开闭原则.里氏代换.依赖倒转.接口隔离.迪米特法则.合成复用原则) 1.开闭原则 2.里氏代换原则 3.依赖倒转原则 4.接口隔离原则 5.迪米特法则 6.合成复用原则 1. ...

  5. 开闭原则、迪米特法则、合成复用原则

    开闭原则 1,一个软件实体如类,模块和函数应该对外扩展开放,对修改关闭,用抽象构建框架,用实现扩展细节 2.当软件需要变化时,尽量通过扩展软件实体的行为来实现变化,而不是通过修改已有的代码来实现变化 ...

  6. 【实验】软件设计原则,迪米特法则与开闭原则

    (一)实验原理 1.迪米特法则:不要和"陌生人"说话.或只与你的直接朋友通信. 我们称出现成员变量.方法参数.方法返回值中的类为直接的朋友,而出现在局部变量中的类则不是直接的朋友. ...

  7. 设计原则(5)-迪米特法则

    本文转自:http://www.cnblogs.com/guoshiandroid/archive/2010/06/19/1760671.html 迪米特法则 慈禧太后为何不和陌生人说话  应用场景举 ...

  8. 六大设计模式原则-迪米特法则

    一.迪米特法则定义 迪米特法则又最少知识原则,其定义如下: 迪米特法则(Law of Demeter, LoD):一个软件实体应当尽可能少的与其他实体发生相互作用. 二.迪米特法则描述 如果一个系统满 ...

  9. Android之大话设计模式 第五章----迪米特法则----慈禧太后为什么不和陌生人说话

    应用场景举例: 在<投名状>这部轰动一时的影片中有这么一个片段,慈禧太后召见庞青龙,带路的太监说,从门口到见到老佛爷(也就是慈禧太后)这条短短的路他花了大半辈子才走完,而很多人一辈子也走不 ...

最新文章

  1. Java中toString函数干嘛用?
  2. 【ArcGIS遇上Python】ArcGIS10.6 python批量将栅格中的特定值替换Setnull为NoData
  3. 在Vs.net中集成 NDoc生成的 Html Help 2帮助文档
  4. qtp12版本下载安装破解教程
  5. 数据结构 周末舞会(循环队列解法)
  6. 手机上ftp测试软件,ftp工具手机版
  7. 202012月计算机考试时间,年全国计算机等级考试时间(范文).docx
  8. Science | 郑文山等发布微生物组单细胞测序新技术Microbe-seq(王军/戴磊/晁彦杰点评)...
  9. 如何修改Windows(可移植)桌面文件夹图标
  10. tlwr840n虚拟服务器,TP-Link TL-WR840N 300M无线路由器设置
  11. mysql变量赋值加冒号,mysql 冒号
  12. treemap倒叙_java对map进行排序(对日期倒叙)
  13. 彻底解决安装包过程中的Requirement already satisfied:问题
  14. 智能对话系统:Unit对话API
  15. 【解决方案】雷电模拟器去桌面底部游戏和游戏中心
  16. ABAP-OOALV-回车事件
  17. 什么是Cookie?怎样设置和读取Cookie?
  18. Eclipse红叉报错
  19. [该死的GIT]七个你无法忽视的 Git 使用技巧
  20. Facebook android 第三方登录

热门文章

  1. 更改netbios计算机名,如何修改NetBios computer name,使得与计算机名稱统一
  2. 阿里云入主千方科技,顺道搞定宇视科技
  3. 团队项目选题——地铁信息查询
  4. html5打包在ios上发布,第二篇 HTML5打包发布IOS APP之苹果开发者账号申请流程
  5. 鸡舍养殖环控系统如何调节鸡舍温湿度
  6. JavaSE - 11 网络编程
  7. 为程序员量身定制的12个目标
  8. mysql数据库 用代码建表
  9. 官宣!Mybatis-Plus 官方神器发布!!!
  10. Java语言程序设计---期末复习