理解Java设计模式编程中的迪米特原则

 更新时间:2016年02月03日 14:18:19   作者:lixiang0522  
这篇文章主要介绍了Java设计模式编程中的迪米特原则,迪米特原则旨在降低类与类之间的耦合,需要的朋友可以参考下

定义:一个对象应该对其他对象保持最少的了解。
问题由来:类与类之间的关系越密切,耦合度越大,当一个类发生改变时,对另一个类的影响也越大。
解决方案:尽量降低类与类之间的耦合。
         自从我们接触编程开始,就知道了软件编程的总的原则:低耦合,高内聚。无论是面向过程编程还是面向对象编程,只有使各个模块之间的耦合尽量的低,才能提高代码的复用率。低耦合的优点不言而喻,但是怎么样编程才能做到低耦合呢?那正是迪米特法则要去完成的。
         迪米特法则又叫最少知道原则,最早是在1987年由美国Northeastern University的Ian Holland提出。通俗的来讲,就是一个类对自己依赖的类知道的越少越好。也就是说,对于被依赖的类来说,无论逻辑多么复杂,都尽量地的将逻辑封装在类的内部,对外除了提供的public方法,不对外泄漏任何信息。迪米特法则还有一个更简单的定义:只与直接的朋友通信。首先来解释一下什么是直接的朋友:每个对象都会与其他对象有耦合关系,只要两个对象之间有耦合关系,我们就说这两个对象之间是朋友关系。耦合的方式很多,依赖、关联、组合、聚合等。其中,我们称出现成员变量、方法参数、方法返回值中的类为直接的朋友,而出现在局部变量中的类则不是直接的朋友。也就是说,陌生的类最好不要作为局部变量的形式出现在类的内部。

下面是一个违反迪米特原则的例子:

public class Teacher { 
 public void teach(Classes classes){ 
  classes.getStudents.getScore.show(); 
 } 
} 


存在什么问题呢?耦合性太高。
1. Student 类中可能会取消Score类。
2. Score类的show方法也可能会被删除。
Student类,Score类对于你来说都是陌生的,当他们改变时,你可能都不知道。
我们可以修改成:

public class Teacher { 
 public void teach(Classes classes){ 
  classes.showScore(); 
 } 
} 
 
public class Classes { 
 public void showScore(Student student){ 
  student.showScore(); 
 } 
} 
 
public class Student { 
 Score score; 
 public void showScore(){ 
  score = new Score(80); 
  score.show(); 
 } 
} 


总结:
1. 迪米特法则的优点在于降低类之间的耦合。
2. 缺点是会产生比较多的小方法,让系统变得比较凌乱,而且通信效率会降低。
3. 设计模式中的应用:门面模式(Facade Pattern)和中介模式(Mediator Pattern)。

相关文章

  • springboot多模块项目mvn打包遇到存在依赖但却无法发现符号问题

    springboot多模块项目mvn打包遇到存在依赖但却无法发现符号问题

    在SpringBoot多模块项目中,如果遇到依赖存在但无法发现符号的问题,常见原因可能是pom.xml配置问题,例如,如果某个模块仅作为依赖而不是启动工程,不应在其pom中配置spring-boot-maven-plugin插件,因为这将影响jar包的生成方式
    2024-09-09
  • Java中将接口返回的字节串转为文件详解

    Java中将接口返回的字节串转为文件详解

    这篇文章主要给大家介绍了关于Java中将接口返回的字节串转为文件的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2021-11-11
  • 一篇文章弄懂Java8中的时间处理

    一篇文章弄懂Java8中的时间处理

    Java8以前Java处理日期、日历和时间的方式一直为社区所诟病,将 java.util.Date设定为可变类型,以及SimpleDateFormat的非线程安全使其应用非常受限,下面这篇文章主要给大家介绍了关于Java8中时间处理的相关资料,需要的朋友可以参考下
    2022-01-01
  • 使用MUI框架构建App请求http接口实例代码

    使用MUI框架构建App请求http接口实例代码

    下面小编就为大家分享一篇使用MUI框架构建App请求http接口实例代码,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-01-01
  • 学习JVM之java内存区域与异常

    学习JVM之java内存区域与异常

    关于JVM内存区域的知识对于初学者来说其实是很重要的,了解Java内存分配的原理,这对于以后JAVA的学习会有更深刻的理解。下面来看看详细介绍。
    2016-07-07
  • Java 多线程优先级实例详解

    Java 多线程优先级实例详解

    这篇文章主要介绍了Java 多线程优先级实例详解的相关资料,需要的朋友可以参考下
    2017-04-04
  • SpringCloud集成Nacos的使用小结

    SpringCloud集成Nacos的使用小结

    这篇文章主要介绍了SpringCloud集成Nacos的使用小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • java实现求两个字符串最长公共子串的方法

    java实现求两个字符串最长公共子串的方法

    这篇文章主要介绍了java实现求两个字符串最长公共子串的方法,是一道华为OJ上的一道题目,涉及Java针对字符串的遍历、转换及流程控制等技巧,需要的朋友可以参考下
    2015-12-12
  • springboot jasypt2.x与jasypt3.x的使用方式

    springboot jasypt2.x与jasypt3.x的使用方式

    在软件开发中,将配置文件中的敏感信息(如数据库密码)进行加密是保障安全的有效手段,jasypt框架提供了这一功能,支持通过加密工具类或命令行工具生成密文,并通过修改配置文件和启动参数的方式使用密文和密钥,这样即便配置文件被泄露
    2024-09-09
  • Java使用Random类生成随机数示例

    Java使用Random类生成随机数示例

    这篇文章主要介绍了Java使用Random类生成随机数,结合实例形式分析了java基于Random类生成随机数与遍历输出相关操作技巧,需要的朋友可以参考下
    2019-07-07

最新评论