定义

  1. 一个对象应该对其他对象保持最少的了解。

狭义的迪米特法则:
如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。如果其中一个类需要调用另一类的某一个方法的话,可以通过第三者转发这个调用。

广义的迪米特法则:
一个模块设计的好坏的一个重要标志就是该模块在多大程度上讲自己的内部数据与实现的有关细节隐藏起来。

一个软件实体应当尽可能少的与其他实体发生相互作用。

每一个软件单位对其他的单位都只有最少的知识,而且局限于那些与本单位密切相关的软件单位。

迪米特法则的目的在于降低类与类之间的耦合。由于每个类尽量减少对其他类的依赖,因此,很容易使得系统的功能模块功能独立,是的相互间存在尽可能少的依赖关系。

在运用迪米特法则到系统的设计中时,要注意以下几点:
第一:在类的划分上,应当创建弱耦合的类,类与类之间的耦合越弱,就越有利于实现可复用的目标。
第二:在类的结构设计上,每个类都应该降低成员的访问权限。
第三:在类的设计上,只要有可能,一个类应当设计成不变的类。
第四:在对其他类的应用上,一个对象对其他类的对象的应用应该降到最低。
第五:尽量限制局部变量的有效范围。

其他解释:
2. 尽量降低类间的耦合
3. 强调之和朋友交流,不和陌生人说话
朋友: 出现在成员变量,成员方法的参数中,成员方法的返回值中的其他类,称为成员朋友类;而出现在方法体内部的类,不属于朋友类)

优点

降低类之间的耦合性,提高代码的复用性

例子

场景:

老板: 想要知道团队中的项目进度
团队领导:告诉老板进度
项目:包含进度信息

public class Test {public static void main(String[] args) {Boss boss = new Boss();TeamLeader teamLeader = new TeamLeader();boss.commandTeamLeader(teamLeader);}
}class Boss{void commandTeamLeader(TeamLeader teamLeader) {teamLeader.sayProccess(new Program());}
}class TeamLeader{void sayProccess(Program program) {program.getProccess();}
}class Program{void getProccess() {System.out.println("当前的项目进度为  50%");}
}

我们发现,Boss类创建了Program类,但是Program对于Boss来说不是朋友关系,不应该产生直接的关系,项目对于老板老说是不可见的,但是对于teamLeader是可见的的,所以修改代码

public class Demo {public static void main(String[] args) {Boss boss = new Boss();TeamLeader teamLeader = new TeamLeader();boss.commandTeamLeader(teamLeader);}
}class Boss{void commandTeamLeader(TeamLeader teamLeader) {//      teamLeader.sayProccess(new Program());teamLeader.sayProccess();}
}class TeamLeader{//void sayProccess(Program program) {//    program.getProccess();//}void sayProccess() {new Program().getProccess();}
}class Program{void getProccess() {System.out.println("当前的项目进度为  50%");}
}


准寻了,迪米特原则,完毕

注意
但是过度使用迪米特法则,也会造成系统的不同模块之间的通信效率降低,使系统的不同模块之间不容易协调等缺点。同时,因为迪米特法则要求类与类之间尽量不直接通信,如果类之间需要通信就通过第三方转发的方式,这就直接导致了系统中存在大量的中介类,这些类存在的唯一原因是为了传递类与类之间的相互调用关系,这就毫无疑问的增加了系统的复杂度。

迪米特原则(最少知道原则)-快速理解相关推荐

  1. java的设计原则_Java设计原则

    引用一段经典的话,"武学的最高境界是无招胜有招",在编程领域,设计模式就可以认为是招数,而真正的内功心法是设计原则: 下面讲述一下编程中应该遵循的基本原则 1.单一职责原则 一个类 ...

  2. 快速理解设计模式六大原则

    设计模式的核心总结起来就一句话:用抽象构建框架,用实现扩展细节.目的就是代码修改的改动量最小 设计模式六大原则 单一职责原则 很好理解,一个类职责要单一,不要承载过多的职责,就比如说我们电脑上所有的文 ...

  3. 围观设计模式(5)--迪米特法则(Lod,Law of Demeter)或最少知道原则(Least Knowledge Principle)

    得墨忒耳(迪米特)定律(Law of Demeter,缩写LoD)亦称为"最少知识原则(Principle of Least Knowledge)",是一种软件开发的设计指导原则, ...

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

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

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

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

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

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

  7. 七大设计原则Java实战之个人理解和图解

    目录 前言 一.单一职责原则 二.开闭原则 三.接口隔离原则 四.依赖倒置原则 五.迪米特法则(最少知道原则) 六.里氏替换原则 七.组合优于继承原则 总结 前言 我们知道23个开发设计模式对应七大设 ...

  8. Java设计模式之设计的6大原则(开闭原则,里氏代换原则,依赖倒转原则,接口隔离原则,最少知道原则,合成复用原则)

    1. 开闭原则 核心思想:一个对象对外扩展开发,对修改关闭 意思就是:对类的改动是通过增加代码进行的,而不是修改现有的代码. 也就是说软件开发人员一旦写出了可以运行的代码,就不应该去改动它,而是要保证 ...

  9. 【设计模式】迪米特法则和六种原则的总结

    迪米特法则 一个对象应该对其他对象保持最少的了解 类与类关系越密切,耦合度越大 迪米特法则又叫最少知道原则,即一个类对自己依赖的类知道的越少越好.也就是说,对于被依赖的类不管多么复杂,都尽量将逻辑封装 ...

最新文章

  1. 数字太大了,计算加法、减法会报错,结果不正确?怎么办?用JavaScript实现大数据(超过20位的数字)相加减运算。
  2. 收藏 | 图像识别的可视化解释神经网络
  3. linux改英语环境,CentOS6.8中/英文环境切换教程图解
  4. Rokid发布YodaOS 并宣布代码开源
  5. 从no-code到low-code:企业级hpaPaaS的未来
  6. JAVA基础系列:反射
  7. Android CoordinatorLayout
  8. chart控件做实时曲线显示_Spark+Kafka+WebSocket+eCharts实时分析-完全记录(5)
  9. mysql5.7 作为openstack的数据库添加bind-address 字段之后mysql不能起来
  10. AMESim中Demo简介
  11. 详解web网站测试的内容以及步骤
  12. 如何通过IDEA看Java源码
  13. 提高迅雷下载速度的方法
  14. 汇编语言 查看存储器中的数据
  15. LintCode 141. 对x开根 JavaScript算法
  16. Linux和Ubuntu的区别详解
  17. Python常见问题之单双引号使用错误
  18. 挑战微信王座,王欣、张一鸣、罗永浩今日同日发布社交app
  19. 电脑装了python后变卡_老电脑windows系统越用越卡的6种解决方法
  20. 基于idea+session组件+wagon实现打包部署

热门文章

  1. 零基础教你如何快速入门Python
  2. MediaPlayerError (1,-110)的问题
  3. android 虚拟导航监听,Android另类判断NavigationBar虚拟导航栏状态
  4. babel.transform code filename: ‘file.ts‘ presets: / our preset / ;报错解法
  5. webpack5使用core-js按需兼容js “presets“: [ [“@babel/preset-env“, { “useBuiltIns“: “usage“, “corejs“:
  6. Cadence OrCAD Capture instance属性和occurences属性的区别
  7. Vue项目中使用proxyTable配置代理失效的解决办法
  8. 相机标定 - (01) - 相机标定简介
  9. python 什么是闭包
  10. 淘宝API接口:item_search_img - 按图搜索淘宝商品(拍立淘)和 upload_img - 上传图片到淘宝