当前位置: 首页 > backend >正文

设计模式七大原则-迪米特法原则

文章目录

  • 一、概念
  • 二、示例
  • 三、代码

一、概念

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

百度词条上定义:迪米特法则(Law of Demeter)又叫作最少知识原则(The Least Knowledge Principle),一个类对于其他类知道的越少越好,就是说一个对象应当对其他对象有尽可能少的了解,只和朋友通信,不和陌生人说话。英文简写为: LOD。

朋友类即为耦合类,这里的朋友定义
1.类成员变量
2.某个类成员函数参数为类对象
3.某个类成员函数返回值为类对象

在编程上,它变成具有以下特点:

1.如果两个类不直接通信,那么这两个类就不应该发生直接的相互作用。

2.在类的结构设计上,每一个类都应该尽量降低成员的访问权限

3.该法则在适配器模式、解释模式等中有强烈的体现

4.强调类之间的松耦合,类之间的耦合越弱,越有利于复用

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

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

二、示例

在这里插入图片描述

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

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

在这里插入图片描述

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

三、代码

class Voice
{
public:void Init(Microphone* pmircrophone){}//声音void openVoice() {};void closeVoice() {};
};class soundCard
{
public:void chooseType(int i){}
private:void soundCardType1() {};void soundCardType2() {};void soundCardType3() {};
};class Microphone
{
public:void Init(){openMicrophone();m_soundCard = new soundCard;m_soundCard->chooseType(1);}//麦克风void openMicrophone() {};void closeMicrophone() {};
public:soundCard* m_soundCard;
};int main(int argv, char* argc[])
{Microphone* pMicrophone = new Microphone;Voice voice;voice.Init(pMicrophone);return 0;
}

————————————————

原文链接:https://blog.csdn.net/qq_42956179/article/details/115372247
————————————————
原文链接:https://blog.csdn.net/lovelion/article/details/7563445

http://www.xdnf.cn/news/11421.html

相关文章:

  • 安全小课堂丨什么是暴力破解?如何防止暴力破解
  • 谷歌浏览器、Yandex浏览器使用体验分享
  • 光流法(optical flow)简介
  • 13800138000来电?手机管家:小心诈骗
  • Windows 10 离线安装 .NET Framework 3.5 的方法和技巧
  • WISP模式
  • waterdrop介绍
  • CreateThread()函数及_beginthreadex()函数
  • C++ ofstream和ifstream详细用法
  • 使用Latex制作分享,演讲,Presentation用的Slides,PPT——Beamer教程
  • .htaccess语法讲解
  • [Linux系列]Chrony时间同步服务器
  • 下载了鲁大师,打开goolgle浏览器弹出360导航页
  • Web前端开发【新手入门指南】
  • JFreeChart 使用介绍
  • maven 环境变量的配置
  • 使用Collections.shuffle打乱集合顺序
  • 曼彻斯特编码
  • build-essential软件包简介
  • 24 | Boost:你需要的“瑞士军刀”
  • JQuery选择器及其样式操作、筛选方法以及链式编程
  • 彩虹表(rainbow table)
  • 如何用GlobalMapper下载高清卫星影像?
  • Apache CXF 架构指南
  • matlab使用教程(73)—指定绘图颜色
  • 【PDF报表】 Jasper Report入门学习
  • 数据库的三范式
  • 程序员都能当黑客吗?IT男、码农和程序猿有啥区别?
  • Aircrack-ng实战案例
  • 【PostgreSQL】postgresql | linux安装postgresql