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

迪米特法则(LoD)

目录

一、主要思想

二、优点

三、 应用示例


迪米特法则,被称为:最少知识原则(Law of Demeter),也被称为“只和直接朋友交流”原则,是一种软件设计原则,旨在减少系统各组件之间的耦合。该原则强调一个对象应该尽量少地了解其他对象的细节,尤其是那些不直接与自己交互的对象。

一、主要思想

1.只与对象的“直接朋友”(直接关联的对象)进行交互。

2. 尽量避免通过链式调用访问对象的内部信息(例如,a.getB().getC().doSomething()),因为这会导致紧耦合。

二、优点

1. 降低耦合度:通过减少对象之间的依赖关系,提升系统的灵活性和可维护性。

2. 提高模块化:有助于将功能模块化,便于进行单元测试和重构。

3. 增强代码的可读性:清晰的责任边界使得代码更易于理解

三、 应用示例

        假设有如下类:

class Engine {  public void start() {  System.out.println("Engine started");  }  
}  class Car {  private Engine engine;  public Car() {  this.engine = new Engine();  }  public Engine getEngine() {  return engine;  }  
}  class Driver {  private Car car;  public Driver(Car car) {  this.car = car;  }  public void startCar() {  // 违反最小知识原则,直接调用链  car.getEngine().start();  }  
}

        在这个例子中,Driver直接访问了Car内部的Engine对象。这意味着Driver依赖于Car和Engine 的实现细节。为了遵循最小知识原则,我们可以通过引入简单的接口或者方法来改进设计:

class Engine {  public void start() {  System.out.println("Engine started");  }  
}  class Car {  private Engine engine;  public Car() {  this.engine = new Engine();  }  // Car 提供的一个高层方法,隐藏 Engine 的实现细节  public void start() {  engine.start();  }  
}  class Driver {  private Car car;  public Driver(Car car) {  this.car = car;  }  public void startCar() {  // 现在 Driver 只需要知道 Car 提供的方法  car.start();  }  
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Python 爬取网页水务数据并实现智慧水务前端可视化
  • Linux的常用操作-02
  • 学懂C++(二十二):高级教程——深入理解 C++ 多线程基础理论和概念
  • RAG私域问答场景超级详细方案(第一期方案)[1]:工业级别构建私域问答(知识处理、知识召回排序、搜索问答模块)
  • 算法基础知识——核函数
  • #java学习笔记(面向对象)----(未完结)
  • 非范型ArrayList和泛型List<T>
  • Service服务在Android中的使用
  • UDP双向通信
  • SQL注入实例(sqli-labs/less-17)
  • CMake,Makefile,CMakeLists.txt的关系和作用
  • 10分钟学会Docker的安装和使用
  • 概述:Dubbo、Nacos、 Zookeeper 等分布式服务协调与治理等技术
  • WUP-CH34X ch34x系列芯片USB转串口通信uniapp插件使用说明
  • leetcode算法刷题记录--7
  • @angular/forms 源码解析之双向绑定
  • Android系统模拟器绘制实现概述
  • iOS 颜色设置看我就够了
  • javascript从右向左截取指定位数字符的3种方法
  • mongodb--安装和初步使用教程
  • PHP的类修饰符与访问修饰符
  • ucore操作系统实验笔记 - 重新理解中断
  • V4L2视频输入框架概述
  • 欢迎参加第二届中国游戏开发者大会
  • 聊聊flink的BlobWriter
  • 使用Maven插件构建SpringBoot项目,生成Docker镜像push到DockerHub上
  • 它承受着该等级不该有的简单, leetcode 564 寻找最近的回文数
  • 体验javascript之美-第五课 匿名函数自执行和闭包是一回事儿吗?
  • 通过几道题目学习二叉搜索树
  • LevelDB 入门 —— 全面了解 LevelDB 的功能特性
  • #NOIP 2014# day.1 T3 飞扬的小鸟 bird
  • (9)目标检测_SSD的原理
  • (Matlab)遗传算法优化的BP神经网络实现回归预测
  • (二)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (南京观海微电子)——I3C协议介绍
  • (七)Knockout 创建自定义绑定
  • (三)Kafka 监控之 Streams 监控(Streams Monitoring)和其他
  • (收藏)Git和Repo扫盲——如何取得Android源代码
  • (译) 理解 Elixir 中的宏 Macro, 第四部分:深入化
  • (转)Android中使用ormlite实现持久化(一)--HelloOrmLite
  • (转载)Linux网络编程入门
  • (自适应手机端)响应式新闻博客知识类pbootcms网站模板 自媒体运营博客网站源码下载
  • .form文件_一篇文章学会文件上传
  • .htaccess配置常用技巧
  • .NET 服务 ServiceController
  • .net6+aspose.words导出word并转pdf
  • /*在DataTable中更新、删除数据*/
  • @FeignClient注解,fallback和fallbackFactory
  • @SpringBootApplication 注解
  • [] 与 [[]], -gt 与 > 的比较
  • [AIR] NativeExtension在IOS下的开发实例 --- IOS项目的创建 (一)
  • [APUE]进程关系(下)
  • [Assignment] C++1
  • [BZOJ4010]菜肴制作
  • [CP_AUTOSAR]_系统服务_DEM模块(一)功能及模块间依赖关系介绍