面向对象设计原则之迪米特法则

2017年10月12日 09:43:03

阅读数:64

迪米特法则来自于1987年美国东北大学(Northeastern University)一个名为“Demeter”的研究项目。迪米特法则又称为最少知识原则(LeastKnowledge Principle, LKP),其定义如下:

迪米特法则(Law of  Demeter, LoD):一个软件实体应当尽可能少地与其他实体发生相互作用。

如果一个系统符合迪米特法则,那么当其中某一个模块发生修改时,就会尽量少地影响其他模块,扩展会相对容易,这是对软件实体之间通信的限制,迪米特法则要求限制软件实体之间通信的宽度和深度。迪米特法则可降低系统的耦合度,使类与类之间保持松散的耦合关系。

迪米特法则还有几种定义形式,包括不要和“陌生人”说话只与你的直接朋友通信等,在迪米特法则中,对于一个对象,其朋友包括以下几类:

(1) 当前对象本身(this);

(2) 以参数形式传入到当前对象方法中的对象;

(3) 当前对象的成员对象;

(4) 如果当前对象的成员对象是一个集合,那么集合中的元素也都是朋友;

(5) 当前对象所创建的对象。

任何一个对象,如果满足上面的条件之一,就是当前对象的“朋友”,否则就是“陌生人”。在应用迪米特法则时,一个对象只能与直接朋友发生交互,不要与“陌生人”发生直接交互,这样做可以降低系统的耦合度,一个对象的改变不会给太多其他对象带来影响。

迪米特法则要求我们在设计系统时,应该尽量减少对象之间的交互,如果两个对象之间不必彼此直接通信,那么这两个对象就不应当发生任何直接的相互作用,如果其中的一个对象需要调用另一个对象的某一个方法的话,可以通过第三者转发这个调用。简言之,就是通过引入一个合理的第三者来降低现有对象之间的耦合度

在将迪米特法则运用到系统设计中时,要注意下面的几点:在类的划分上,应当尽量创建松耦合的类,类之间的耦合度越低,就越有利于复用,一个处在松耦合中的类一旦被修改,不会对关联的类造成太大波及在类的结构设计上,每一个类都应当尽量降低其成员变量和成员函数的访问权限在类的设计上,只要有可能,一个类型应当设计成不变类在对其他类的引用上,一个对象对其他对象的引用应当降到最低

下面通过一个简单实例来加深对迪米特法则的理解:

Sunny软件公司所开发CRM系统包含很多业务操作窗口,在这些窗口中,某些界面控件之间存在复杂的交互关系,一个控件事件的触发将导致多个其他界面控件产生响应,例如,当一个按钮(Button)被单击时,对应的列表框(List)、组合框(ComboBox)、文本框(TextBox)、文本标签(Label)等都将发生改变,在初始设计方案中,界面控件之间的交互关系可简化为如图1所示结构:

图1 初始设计方案结构图

在图1中,由于界面控件之间的交互关系复杂,导致在该窗口中增加新的界面控件时需要修改与之交互的其他控件的源代码,系统扩展性较差,也不便于增加和删除新控件。

现使用迪米特对其进行重构。

在本实例中,可以通过引入一个专门用于控制界面控件交互的中间类(Mediator)来降低界面控件之间的耦合度。引入中间类之后,界面控件之间不再发生直接引用,而是将请求先转发给中间类,再由中间类来完成对其他控件的调用。当需要增加或删除新的控件时,只需修改中间类即可,无须修改新增控件或已有控件的源代码,重构后结构如图2所示:

图2  重构后的结构图

转载于:https://www.cnblogs.com/jiangtao1218/p/9439341.html

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

  1. java 迪米特_Java设计原则—迪米特法则(转)

    定义: 迪米特法则(Law of Demeter,LoD)也称为最少知识原则(Least Knowledge Principle,LKP). 一个对象应该对其他对象有最少的了解.通俗地讲,一个类应该对 ...

  2. 【设计模式】七大设计原则--------迪米特法则(得墨忒耳定律)(最少知识定律)

    文章目录 1.介绍 2.示例 3.改进 1.介绍 得墨忒耳,是希腊神话的农业女神. 得墨忒耳定律主要内容为: (1)每个单元对于其他的单元只能拥有有限的知识:只是与当前单元紧密联系的单元: (2)每个 ...

  3. 设计模式六大原则——迪米特法则(LoD)

    1.背景 在图书馆借书.刚開始的时候,直接跑到对应的楼层去,到里面去转,去找要借的书,在里面溜达半天才干找到:后来知道图书馆有一个电脑查询处.然后直接在电脑上输入想要借的书,电脑就会显示你想要借的书的 ...

  4. C++设计原则——迪米特法则

    系列文章目录 C++开闭原则 C++迪米特法则 文章目录 系列文章目录 前言 一.迪米特法则定义 二.使用场景 总结 前言 为什么我们要在软件开发中使用设计模式. 为了代码可重用性.增加可维护性,让代 ...

  5. 六大设计原则 ——迪米特法则

    迪米特法则描述的是:一个对象应该对其他对象有最少的了解.通俗的讲 ,一个类应该对自己需要耦合或调用的类知道得最少,你的内部是如何复杂都和我没关系,那是你的事,我就知道你提供了这么多public方法,我 ...

  6. Java设计原则——迪米特法则

    我们一定要给自己提出这样的任务:第一,学习,第二是学习,第三还是学习. 学习从来无捷径,循序渐进登高峰. 目录 一.基本介绍 二.应用实例 1.示例一 2.示例二 三.迪米特法则 部分笔记来源于尚硅谷 ...

  7. 软件设计原则——迪米特法则

    迪米特法则 迪米特法则又叫最少知识原则 只和你的直接朋友交谈,不跟"陌生人"说话(Talk only to your immediate friends and not to st ...

  8. 设计原则 - 迪米特法则

    目录 概念 编码 实例 迪米特法则实现 源码 概念 迪米特法则(Law of Demeter, LoD):一个软件实体应当尽可能少地与其他实体发生相互作用. 核心观念:类之间的解耦,尽量降低类与类之间 ...

  9. 面向对象六大原则——迪米特法则

    什么是迪米特法则(Law of Demeter, LoD)  迪米特法则也可以称为最少知识法则(Least Knowledge Principle, LKP).它们都描述了一个规则:一个对象应该对其他 ...

  10. 设计模式:KISS、YAGNI、DRY 原则,迪米特法则(LOD)

    如何理解"KISS 原则"? KISS 原则的英文描述有好几个版本,比如下面这几个. Keep It Simple and Stupid. Keep It Short and Si ...

最新文章

  1. freemarker模板文件中文本域(textarea)的高度自适应实现
  2. php mysql通用类_PHP连接MYSQL数据库通用类_PHP教程
  3. Python 中 Mock 到底该怎么玩?一篇文章告诉你(超全)
  4. 二进制_简学:二进制数制的应用
  5. UE4 Roadmap
  6. 关联规则挖掘算法之Apriori算法
  7. 使用QT写的串口调试助手源代码分享(一)
  8. C#多个DataTable根据某一列匹配,其余字段相加求和的高效算法。
  9. python利用opencv去除图片logo_用python+OpenCV去除图片水印
  10. aspx 微型_如何使用微型可编程机器人向孩子介绍编码
  11. Vue:前端体系与前后端分离
  12. Python学习笔记--day15 内置模块和开发规范
  13. ‘\0‘到底是什么?
  14. SecureCRT找回密码
  15. 【C语言】还搞不明白结构体吗?不妨来看看这篇文章,带你初步了解结构体
  16. 12.5 比较判别法极限形式
  17. Android 内存泄露分析
  18. KISSY基础篇乄KISSY之Anim(1)
  19. 技术达人博客网址大全
  20. 你知道乌克兰的科技公司吗?他们现在的处境如何呢?

热门文章

  1. CocosCreator简单小鸟穿越隧道小游戏
  2. 游戏筑基开发之环形数组(C语言)
  3. Kubernetes之实战入门
  4. doc命令操作数据库(下)
  5. macOS 运行react项目
  6. 不会点SQLite,都不好意思说自己是开发的 1
  7. Ubuntu 携手初创企业用代码开拓物联网
  8. ServletContextListener 启动SPRING加载数据到缓存的应用
  9. Linux的append函数,linux block层
  10. win10 mysql zip 安装教程_windows10+mysql8.0.11zip安装教程详解