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

【设计模式笔记07】:迪米特法则

文章目录

      • 迪米特法则 (LoD)
        • 1. 定义
        • 2. “朋友”的界定
        • 3. 典型应用
        • 4. 实例:CRM系统界面控件交互

迪米特法则 (LoD)

1. 定义

迪米特法则,也称为最少知识原则 (LKP),它有多种定义方式,但核心思想都是一致的。

  • 定义1 (最通俗的): 不要和“陌生人”说话。 (Don’t talk to strangers.)

    • 这个定义非常形象地表达了原则的精髓。一个对象应该尽可能少地了解其他对象的内部细节。
  • 定义2 (进一步解释): 只与你的直接朋友通信。

    • 这引出了一个关键概念:“朋友”。接下来会详细解释什么是“朋友”。
  • 定义3 (最正式的): 每一个软件单位对其他的单位都都只有最少的知识,而且局限于那些与本单位密切相关的软件单位。

    • 这里的“软件单位”可以指一个类、一个模块或一个函数。这个定义强调了知识的“局部化”,避免信息在系统中不必要地传播。
2. “朋友”的界定

理解迪米特法则的关键在于理解什么是“直接朋友”。

  • 耦合与朋友关系:

    • 在面向对象的世界里,每个对象都会与其他对象有耦合关系。只要两个对象之间有耦合关系,就说这两个对象之间是朋友关系
    • 耦合的方式很多,如依赖、关联(组合与聚合)等。
  • 直接朋友 (Direct Friends):

    • 对于一个类(比如类 A)来说,它的“直接朋友”包括以下几种:
      1. A 自身的成员变量所引用的对象。
      2. A 中某个方法的方法参数所引用的对象。
      3. A 中某个方法的方法返回值所引用的对象。
      4. A 自身的对象(this)。
  • “陌生人” (Strangers):

    • 迪米特法则要求,陌生的类最好不要以局部变量的形式出现在类的内部。
    • 一个类只与它的直接朋友通信,而以局部变量形式出现的类不是该类的直接朋友。
    • 典型的违反场景: 连续的 . 调用,如 a.getB().getC().doSomething()。在这个链式调用中,a 是朋友,但 bc 对象对于当前类来说就是“陌生人”。我们通过朋友 a 的“介绍”认识了陌生人 b,又通过 b 认识了 c,这违反了“只和直接朋友说话”的原则。
3. 典型应用
  • 外观模式 (Facade Pattern)中介者模式 (Mediator Pattern) 都是迪米特法则的典型应用。
    • 外观模式: 为一个复杂的子系统提供一个统一的、简化的接口。客户端只需要与这个外观接口(直接朋友)交互,而不需要了解子系统内部众多类(陌生人)的复杂关系。
    • 中介者模式: 用一个中介对象来封装一系列的对象交互。各个对象不再直接相互引用,而是都只与中介者(直接朋友)通信,由中介者协调它们之间的交互,将网状的复杂关系变为星状的简单关系。
4. 实例:CRM系统界面控件交互
  • a. 初始设计 (违反LoD)
    • 场景: 一个CRM系统包含很多业务操作窗口,在这些窗口中,某些界面控件之间存在复杂的交互关系。一个控件事件的触发将导致多个其他界面控件产生响应。
    • 具体例子: 当一个按钮 Button 被单击时,对应的列表框 List、组合框 ComboBox、文本框 TextBox 和文本标签 Label 等都将发生改变。
    • 设计方案: 在初始设计中,这些界面控件之间直接进行交互,形成了一个复杂的网状结构。

在这里插入图片描述

  • 问题分析:

    • 高耦合: Button 类直接了解并调用了 ListComboBox 等多个控件的细节,反之亦然。每个控件都认识了太多“朋友”,导致它们之间紧密耦合。
    • 扩展性差: 如果此时需要增加一个新的界面控件(例如一个 CheckBox),并且它需要与现有控件交互,那么可能需要修改多个与之交互的其他控件的源代码,系统扩展性较差,需要重构。
  • b. 重构后的设计 (遵循LoD)

    • 重构目标: 降低界面控件之间的耦合度,使它们不再直接交互。
    • 解决方案: 引入一个中介类 (Mediator),专门用于控制界面控件之间的交互。

在这里插入图片描述

图片描述:重构后的UML对象图。Button, List, Label, ComboBox, TextBox 不再相互关联,而是都只与中心的Mediator类发生关联,形成了一个星型结构。

  • 工作流程:
    1. 所有的控件(如 Button)都只认识中介者 Mediator 这个“直接朋友”。
    2. Button 被点击时,它不会直接去操作 ListTextBox,而是通知中介者 Mediator:“我被点击了”。
    3. 中介者 Mediator 接收到请求后,再由它来完成对其他控件(List, TextBox 等)的调用和协调。
  • 重构后优点:
    • 低耦合: 界面控件之间不再产生直接引用,它们都只依赖于中介者。
    • 高内聚: 每个控件只负责自己的行为和通知中介者,而复杂的交互逻辑被封装在中介者内部。
    • 易于维护和扩展: 如果要修改交互逻辑,只需要修改中介者类。如果要增加新的控件,也只需要让它和中介者交互即可,对现有控件类的影响降到了最低。这完美地体现了迪米特法则的精神。
http://www.dtcms.com/a/536217.html

相关文章:

  • SIP协议详解:从请求到挂断的全生命周期
  • 药材网网站技术建设手机网站微信链接怎么做
  • 【Linux】 第一个系统程序——进度条
  • 旅游seo整站优化宁波做网站有哪些公司公司
  • CircleCI 让持续集成变得简单而高效的开源框架
  • Ribbon是如何与服务注册中心nacos交互的
  • 自然语言处理框架:Bert和Transformer
  • (N_157)基于springboot,vue服装商城系统
  • 介绍一下Ribbon
  • 潍坊有哪些网站旅行社网站规划与建设的流程图
  • (项目管理系列课程)项目规划阶段:项目进度管理-估算活动持续时间
  • STM32定时器的输入捕获模式(测量PWM的周期与占空比)
  • 智慧校园数字孪生选型指南:选对平台做好交付,从平台适配到交付落地的全流程解决方案
  • php招生网站开发标准网站建设价格
  • 【NestJS】在 nest.js 项目中,如何使用 Postgresql 来做缓存?
  • 解决由于没有远程桌面授权服务器可以提供许可证,远程会话被中断.的方法
  • 初始化服务器
  • 玉林建设信息网站帮别做网站
  • 【C++ 内存管理、模板初阶与 STL 简介】:打通高效编程的关键链路
  • web开发,在线%高校舆情分析%系统demo,基于python,flaskweb,echart,nlp,ida,tf-idf,多爬虫源,数据库mysql
  • 安装双系统
  • AI研究-113 DeepSeek-OCR 原理与架构全解|视觉压缩长文本 SAM-base 16×下采样 CLIP-L 3B-MoE
  • R语言绘制复杂加权数据(nhanes数据)生存分析决策曲线
  • 常州溧阳建设工程管理中心网站做网站平台的公司
  • 政务领域应用:国密 SSL 证书如何守护 “一网通办” 的数据安全?
  • LM实现教程:基于 nanochat项目 从零开始理解大语言模型
  • 【南京大学主办】第三届数学与机器学习国际学术会议(ICMML 2025)
  • 淮北市建设局网站福建省住房和城乡建设局网站
  • 无锡企业网站龙岩kk网最新招聘
  • 告别纸张,迎接更加高效的文档管理——Paperless-ngx介绍