1.什么是迪米特原则?

  1. 一个对象应该对其他对象保持最少的了解。
  2. 类与类关系越密切,耦合度越大。
  3. 迪米特法则(Demeter Principle)又叫最少知道原则,即一个类对自己依赖的类知道的越少越好。也就是说,对于被依赖的类不管多么复杂,都尽量将逻辑封装在类的内部。对外除了提供的public方法,不对外泄露任何信息。
  4. 迪米特法则还有个更简单的定义:只与直接的朋友通信。
  5. 直接的朋友:每个对象都会与其他对象有耦合关系,只要两个对象之间有耦合关系,我们就说这两个对象之间是朋友关系。耦合的方式很多,依赖,关联,组合,聚合等。其中,我们称出现成员变量,方法参数,方法返回值中的类为直接的朋友,而出现在局部变量中的类不是直接的朋友。也就是说,陌生的类最好不要以局部变量的形式出现在类的内部。

2.违反迪米特原则代码案例

代码中的注释我已经写的很详细了,大家有问题即可指出。

package com.szh.principle.demeter;import java.util.ArrayList;
import java.util.List;/****/
//学校总部员工类
class Employee {private String id;public void setId(String id) {this.id = id;}public String getId() {return id;}
}//学院的员工类
class CollegeEmployee {private String id;public void setId(String id) {this.id = id;}public String getId() {return id;}
}//管理学院员工的管理类
class CollegeManager {//返回学院的所有员工public List<CollegeEmployee> getAllEmployee() {List<CollegeEmployee> list = new ArrayList<>();for (int i = 1; i <= 5; i++) { //这里我们增加了5个员工到 listCollegeEmployee emp = new CollegeEmployee();emp.setId("学院员工id= " + i);list.add(emp);}return list;}
}//学校管理类
//分析 SchoolManager 类的直接朋友类有哪些: Employee、CollegeManager
//CollegeEmployee 不是 直接朋友, 而是一个陌生类, 这样违背了 迪米特法则
class SchoolManager {//返回学校总部的员工public List<Employee> getAllEmployee() {List<Employee> list = new ArrayList<>();for (int i = 1; i <=3 ; i++) { //这里我们增加了3个员工到 listEmployee emp = new Employee();emp.setId("学校总部员工id= " + i);list.add(emp);}return list;}//该方法完成输出学校总部和学院员工信息(id)void printAllEmployee(CollegeManager sub) {//分析问题//1. 这里的 CollegeEmployee 不是 SchoolManager 的直接朋友//2. CollegeEmployee 是以局部变量方式出现在 SchoolManager//3. 违反了 迪米特法则//获取到学院员工List<CollegeEmployee> list1 = sub.getAllEmployee();System.out.println("------------学院员工------------");list1.stream().map(CollegeEmployee::getId).forEach(System.out::println);//获取到学校总部员工List<Employee> list2 = this.getAllEmployee();System.out.println("------------学校总部员工------------");list2.stream().map(Employee::getId).forEach(System.out::println);}
}public class Demeter {public static void main(String[] args) {//创建了一个 SchoolManager 对象SchoolManager schoolManager = new SchoolManager();//输出学院的员工id 和 学校总部的员工信息schoolManager.printAllEmployee(new CollegeManager());}
}


3.遵守迪米特原则代码案例

前面设计的问题在于SchoolManager 中,CollegeEmployee 类并不是SchoolManager类的直接朋友。

按照迪米特法则,应该避免类中出现这样非直接朋友关系的耦合。我们将上面的代码进行修改,使其遵守迪米特原则。

package com.szh.principle.demeter.improve;import java.util.ArrayList;
import java.util.List;/****/
//学校总部员工类
class Employee {private String id;public void setId(String id) {this.id = id;}public String getId() {return id;}
}//学院的员工类
class CollegeEmployee {private String id;public void setId(String id) {this.id = id;}public String getId() {return id;}
}//管理学院员工的管理类
class CollegeManager {//返回学院的所有员工public List<CollegeEmployee> getAllEmployee() {List<CollegeEmployee> list = new ArrayList<>();for (int i = 1; i <= 5; i++) { //这里我们增加了5个员工到 listCollegeEmployee emp = new CollegeEmployee();emp.setId("学院员工id= " + i);list.add(emp);}return list;}//输出学院员工的信息public void printEmployee() {//获取到学院员工List<CollegeEmployee> list1 = getAllEmployee();System.out.println("------------学院员工------------");list1.stream().map(CollegeEmployee::getId).forEach(System.out::println);}
}//学校管理类
//分析 SchoolManager 类的直接朋友类有哪些: Employee、CollegeManager
//CollegeEmployee 不是 直接朋友, 而是一个陌生类, 这样违背了 迪米特法则
class SchoolManager {//返回学校总部的员工public List<Employee> getAllEmployee() {List<Employee> list = new ArrayList<>();for (int i = 1; i <= 3; i++) { //这里我们增加了3个员工到 listEmployee emp = new Employee();emp.setId("学校总部员工id= " + i);list.add(emp);}return list;}//该方法完成输出学校总部和学院员工信息(id)void printAllEmployee(CollegeManager sub) {//分析问题//改进代码:将输出学院的员工方法,封装到CollegeManagersub.printEmployee();//获取到学校总部员工List<Employee> list2 = getAllEmployee();System.out.println("------------学校总部员工------------");list2.stream().map(Employee::getId).forEach(System.out::println);}
}public class Demeter {public static void main(String[] args) {System.out.println("~~~使用迪米特法则的改进~~~");//创建了一个 SchoolManager 对象SchoolManager schoolManager = new SchoolManager();//输出学院的员工id 和  学校总部的员工信息schoolManager.printAllEmployee(new CollegeManager());}
}


4.迪米特原则的注意事项

  1. 迪米特法则的核心是降低类之间的耦合。
  2. 但是注意:由于每个类都减少了不必要的依赖,因此迪米特法则只是要求降低类间(对象间)耦合关系,并不是要求完全没有依赖关系。

设计模式七大原则——迪米特原则相关推荐

  1. js的七大设计原则--迪米特原则

    一.什么是迪米特原则 迪米特原则也叫最少知道原则,一个类应该对其他对象保持最少的了解.通俗来讲,就是一个类对自己依赖的类知道的越少越好.因为类与类之间的关系越密切,耦合度越大,当一个类发生改变时,对另 ...

  2. 【设计模式】软件设计七大原则 ( 迪米特原则 | 代码示例 )

    文章目录 一.迪米特原则简介 二.迪米特原则代码示例 ( 反面示例 ) 1.经理类 2.员工类 3.商品类 4.测试类 三.迪米特原则代码示例 ( 推荐用法 ) 1.经理类 2.员工类 3.商品类 4 ...

  3. 设计模式—— 五:迪米特原则

    文章目录 什么是迪米特原则? 迪米特法则的含义 1. 只和朋友交流 不遵循迪米特法则的定义 遵循迪米特法则的定义 2. 朋友间也是有距离的 不遵循迪米特原则的设计 遵循迪米特原则的设计 3. 是自己的 ...

  4. java设计模式之设计原则⑤迪米特原则

    定义: (1)一个对象应该对其他对象保持最少的了解.又叫最少知道原则 (2)尽量降低类与类之间的耦合 (3)强调只和朋友交流,不和陌生人说话(意思就是对外部引入的类越少越好). 朋友:指的是出现在成员 ...

  5. 设计模式六大原则:迪米特原则-带你走进梦幻西游(四)

    转载请标明:http://blog.csdn.net/liulongling/article/details/51332685 面向对象其它六大原则 单一职责原则-带你走梦幻西游(一) 依赖倒置原则( ...

  6. 软件设计原则 —— 迪米特原则和合成复用原则

    迪米特法则(Law of Demeter)又叫作最少知识原则(Least Knowledge Principle 简写LKP),一个类对于其他类知道的越少越好,就是说一个对象应当对其他对象有尽可能少的 ...

  7. 设计原则-迪米特原则与合成复用原则

    迪米特原则(Law of Demeter LoD) 迪米特原则又叫最少知道原则(Least Knowledge Principle,LKP),这里的最少知道主要是强调,调用者对传入的参数,和接受到的返 ...

  8. 软件架构设计原则--迪米特原则

    本专栏内容参考自:咕泡学院Tom老师的<Spring5核心原理与30个类手写实战>,仅作个人学习记录使用,如有侵权,联系速删   迪米特原则(Law of Demeter,LoD)是指一个 ...

  9. 必知必会的设计原则——迪米特原则

    概述 迪米特法则(Law of Demeter )又叫做最少知识原则,即一个对象应该对另一个对象有最少的了解. 迪米特法则的目的在于降低类之间的耦合.由于每个类尽量减少对其他类的依赖,因此,很容易使得 ...

最新文章

  1. 脑机综述(一) | 脑机接口在康复医学中的应用进展
  2. java jfreechart 画图_java – Jfreechart XYPlot,我如何将绘图绘制到绘图区?
  3. 最课程阶段大作业05:污水处理系统以及百度地图
  4. Apache Solr入门教程
  5. 浅谈O2O行业的猎人与农夫【更新完毕】
  6. openssl 添加自定义算法_GitHub:用PyTorch实现17种深度强化学习算法
  7. 二路单调自增子序列模型【acdream 1216】
  8. Java-马士兵设计模式学习笔记-策略模式-模拟Comparable接口
  9. 九江职业技术学院工业机器人_黑龙江农业工程职业学院学子喜获工业机器人大赛一等奖...
  10. c语言论坛编程,[原创]了解c语言
  11. pixel-anchor 相关概念
  12. Turbo跨平台开源渲染引擎
  13. S5700交换机出现discarding丢弃错误处理办法
  14. 5G NR协议栈SDAP、PDCP
  15. 美颜sdk动态贴纸技术、代码分析
  16. GBase 8a数据库加载流程介绍
  17. 平面最近点距离问题(分治法)
  18. EasyNVR无插件摄像机直播之:摄像机网页低延时无插件直播实现
  19. JAVA-SUST实验一 JSP技术及JSP语法基础
  20. 三年级计算机课可以画的图有,三年级上册画画图片

热门文章

  1. 计算机固态硬盘作用,盘点固态硬盘的几个好处,原来都是机械硬盘惹的祸!
  2. 动态规划_求最长公共子序列LCS
  3. Educoder:jQuery遍历
  4. ༺ཌ༈常见浏览器介绍༈ད༻
  5. 市值蒸发2000亿,被顶格处罚,跟谁学改名难“高途”
  6. windows系统安装驱动时不知道设备的硬件型号怎么办?
  7. mysql查询主键sql语句_MySQL数据库-表操作-SQL语句(一)
  8. VMware虚拟机快照
  9. matlab循环语句提高效率,matlab – 循环语句性能并预先分配循环语句本身
  10. 施密特(Schimidt)正交化与正交匹配追踪