迪米特原则定义

迪米特原则,也叫最少知道原则,即一个类应该对自己依赖的类知道的越少越好,而你被依赖的类多么复杂,对我都没有关系。也就是说,对于别依赖的类来说,不管业务逻辑多么复杂,都应该尽量封装在类的内部;对外除了必备的public方法,不再泄露任何信息。

1.问题由来

我们知道,类和类是有耦合关系的,关系越密切的两个类之间,其耦合关系越大。

2.对应措施

迪米特原则要求:一个类应该只和之间的直接朋友通信。

1.直接朋友的定义

在上面我们提到了“直接朋友”这个概念,其实,在一个程序对象中,每个类都会和其他类有耦合关系,不然也就没有必要存在了。耦合的方式包括:依赖、关联、组合、聚合等。我们说,有耦合关系的两个类之间的关系,就是朋友关系。

3.应用实践

迪米特原则要求我们做到以下四点:

1.只和直接朋友沟通

为了说明这点,我们需要一个例子:比如在一所大学内有各个学院,现在要求打印出各个学院和学校总部的员工ID。代码演示如下:

 public class Demeter1 {public static void main(String[] args) {SchoolManager schoolManager = new SchoolManager();schoolManager.printAllEmp(new CollegeManager());}
}class SchoolManager {public void printAllEmp(CollegeManager collegeManager) {List<Employee> empList = this.getAllEmployee();System.out.println("打印学校总部的员工");for (Employee employee: empList) {employee.printId();}//分析问题//1. 这里的 CollegeEmployee 不是  SchoolManager的直接朋友//2. CollegeEmployee 是以局部变量方式出现在 SchoolManager//3. 违反了 迪米特法则List<CollegeEmployee> collegeEmpList = collegeManager.getAllEmployee();System.out.println("打印学院员工");for (CollegeEmployee collegeEmployee: collegeEmpList) {collegeEmployee.printId();}}//返回所用总部信息public List<Employee> getAllEmployee() {List<Employee> list = new ArrayList<>();//添加5名总部的员工for (int i=0; i<5;i++) {Employee employee = new Employee();employee.setId(i);list.add(employee);}return list;}
}//学院员工的管理类
class CollegeManager {//返回学院的所有员工public List<CollegeEmployee> getAllEmployee() {List<CollegeEmployee> list = new ArrayList<>();//添加10名学院员工for (int i = 0; i < 10; i++) {CollegeEmployee emp = new CollegeEmployee();emp.setId(i);list.add(emp);}return list;}
}//学校员工类
class Employee {private Integer id;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public void printId() {System.out.println("学校员工,ID=" + this.getId());}
}//学院员工类
class CollegeEmployee {private Integer id;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public void printId() {System.out.println("学院员工,ID=" + this.getId());}
}

根据上面的代码,我们来找一下类SchoolManager的直接朋友:Employee、CollegeManager,而CollegeEmployee 是以局部变量方式出现在 SchoolManager,这就违背了“迪米特原则”。

改进措施

既然如此,我们就要将CollegeEmployee从SchoolManager类中抽离出来,使其不被依赖。

  public void printCollegeEmps() {List<CollegeEmployee> list = this.getAllEmployee();for (CollegeEmployee collegeEmployee: list) {collegeEmployee.printId();}}

2.和朋友也要保持适当距离

看到这里你可能会困惑,既然已经要求我们做到:一个类只和直接朋友沟通,那么为什么还要保持距离呢?还是举例说明:现在有两个类A、B,类A中有三个public方法,类B需要调用A中的三个方法来完成一个流程:

public class Demeter2 {public static void main(String[] args) {A a = new A();B b = new B();b.invokerA(a);}
}class A {public void method1() {System.out.println("执行第一个方法");}public void method2() {System.out.println("执行第二个方法");}public void method3() {System.out.println("执行第三个方法");}}class B {public void invokerA(A a) {System.out.println("调用A的buildMethod()...");a.method1();a.method2();a.method3();}
}

OK,功能完成了,但是,类B需要依次调用类A的三个方法,需要保持三个方法对类B都是可见的。也就是说,类B和类A的耦合度太高了,我们可以改善一下两者的关系,适度的降低一下耦合度。在类A中定义一个public方法,来封装类B的逻辑,其余方法设置为private。

 //类A的相应修改private void method1() {System.out.println("执行第一个方法");}private void method2() {System.out.println("执行第二个方法");}private void method3() {System.out.println("执行第三个方法");}public void buildMethod() {System.out.println("流程开始");method1();method2();method3();System.out.println("流程结束");}

3.是自己的就是自己的

当一个方法放在本类和其他类中都可以的时候,那么,如果,一个方法放在本类中,不会增加类之间的耦合度,也不会造成不良影响,放在本类中

4.慎用Serializable

举例来说,在一个项目中使用RMI方式传递一个VO对象时,这个对象就必须实现Serializable接口,也就是进行序列化。当你突然将客户端这个VO对象的访问权限从private更改为public的时候,而服务端没有进行对应的改变,就会出现错误。

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

1.迪米特原则的核心就是降低类之间的耦合。只有耦合降低了,类的复用率才能提高。

2.注意事项:

凡事讲究适度,迪米特原则要求降低类之间的耦合,并不是要求没有耦合。

设计模式:迪米特原则相关推荐

  1. 报童、钱包和迪米特法则(设计模式迪米特原则经典论文翻译)

    写在文章前: 或许你写过无数代码,参与过很多大型系统的设计,但,你是否曾经思考过,你的设计可扩展.易维护么,在高速变化的互联网世界里,它能经得起这种急速变化的考验么?如果你没想过这些问题,那请先放下你 ...

  2. 设计模式——迪米特原则

  3. 设计模式之六大原则(实现部分)

    设计模式之单一职责模式 常用 在只有一个变量发生改变造成整个数据的变动等 实现方法 写一个公共接口 在用不同的变量 去实现该接口方法就行 接口例子 /*** 单一职责模式** @Date:2022/4 ...

  4. 面试官问你如何进行程序设计?——设计模式之七大原则——接口隔离、合成复用、迪米特法则以及C++设计实现

    设计模式的设计原则之2.0 七大原则 5.接口隔离(InterfaceSegregation Principle,ISP) 5.1.背景 5.2.定义 5.3.特征 5.4.应用 6.迪米特原则(La ...

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

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

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

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

  7. 设计模式六大原则(5)——迪米特原则

    定义:一个对象应该对其他对象保持最少的了解. 问题由来:类与类之间的关系越密切,耦合度越大,当一个类发生改变时,对另一个类的影响也越大. 解决方案:尽量降低类与类之间的耦合. 自从我们接触编程开始,就 ...

  8. [设计模式原则]第五回:迪米特原则

    1.引言 迪米特法则(Law of Demeter)又叫作最少知识原则(LKP,Least Knowledge Principle),就是说一个对象应当对其他对象有尽可能少的了解,类与类之间的了解的越 ...

  9. 【学习笔记】慕课网—Java设计模式精讲 第3章 软件设计七大原则-3-6 迪米特原则(最少知道原则)...

    /** * 软件设计七大原则-迪米特原则 学习笔记 * @author cnRicky * @date 2018.11.10 */ 迪米特原则(最少知道原则) 一个对象应该对其他对象保持最少的了解.又 ...

最新文章

  1. hdu4772 水模拟
  2. 利用WindowsPhone7_SDK_Full.rar_for_xp,在xp下安装sdk,部署xap软件的教程
  3. 教育部:2006年江西高职(专科)院校名单
  4. NAS、CIFS、NFS之间的关系
  5. mac 内核调试环境搭建
  6. xcode7: Undefined symbols for architecture i386: _iconv_open, referenced from:
  7. java spark yarn_《Spark官方文档》在YARN上运行Spark
  8. Maven编译时跳过Test
  9. Java -Dfile.encoding=UTF-8 的使用
  10. 我们的地盘,我们做主
  11. yapi文档转换jmx脚本
  12. 测试高考体育成绩的软件,高考体育考试项目内容及成绩评定标准
  13. logstash集成elasticsearch报错: Attempted to resurrect connection to dead ES instance
  14. 消费者和生产者问题,管程法和信号灯法
  15. 为何别人实操很强?因为他用这70个Python项目学习练手!它值得你收藏落灰!
  16. 《巴黎协定》正式生效 新能源需核心竞争力
  17. 计算机考研817,2017年南京工业大学计算机科学与技术学院817信号系统与数字电路考研题库...
  18. 客户端渲染(CSR)和服务端渲染(SSR)差别
  19. outlook express 邮件附件都带有att000xxx.htm 附件?
  20. Sketch(二)——图标集画微信图标

热门文章

  1. ADSL提速 从入门到精通
  2. Photoshop的批处理(有海量的数码照片,想传上网的话就看下)
  3. Halcon:Image、region、xld常用的处理
  4. 创建一个最简单的imgui测试用例
  5. PHY以太网自动协商原理
  6. python轮廓函数的使用
  7. 【数字信号处理】 第二章、时域中的离散时间信号
  8. 值重新赋值_JavaScript-赋值运算符
  9. 如何设置坐标原点值_氨气检测仪电化学原理及报警值如何设置
  10. 统计一个数的补码中二进制中1的个数