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

大话设计模式之迪米特法则

迪米特法则,也称为最少知识原则(Law of Demeter),是面向对象设计中的一个重要原则,其核心思想是降低耦合度、减少对象之间的依赖关系,从而使系统更加灵活、易于维护和扩展。

根据迪米特法则,一个对象应该对其他对象有尽可能少的了解,只与其直接朋友进行交互。直接朋友指的是以下几种情况:

  1. 该对象本身
  2. 该对象的成员对象
  3. 方法参数中的对象
  4. 方法内部创建的对象

迪米特法则的目标在于降低类之间的耦合度,避免在一个类中引入过多的依赖,以减少系统中各个类之间的直接联系,从而减少系统的复杂性,提高系统的可维护性和灵活性。

实践迪米特法则可以通过以下几点来实现:

  1. 在设计类时,尽量减少类之间的直接关联,避免在一个类中直接调用另一个类的方法。
  2. 引入中介者或外观模式,将复杂的交互逻辑封装在一个中介对象中,减少对象之间的直接通信。
  3. 使用接口来定义对象之间的通信协议,而不是直接依赖具体的类。

遵循迪米特法则可以使系统更加灵活,降低代码的耦合度,提高代码的可维护性和扩展性。

#include <iostream>// 学生类
class Student {
public:Student(std::string name) : name(name) {}std::string getName() { return name; }private:std::string name;
};// 班级类
class Classroom {
public:void addStudent(Student* student) {students.push_back(student);}private:std::vector<Student*> students;
};// 学校类
class School {
public:void addClassroom(Classroom* classroom) {classrooms.push_back(classroom);}private:std::vector<Classroom*> classrooms;
};int main(int argc, char *argv[])
{// 创建学生对象Student* student1 = new Student("Alice");Student* student2 = new Student("Bob");// 创建班级对象并添加学生Classroom* classroom1 = new Classroom();classroom1->addStudent(student1);classroom1->addStudent(student2);// 创建学校对象并添加班级School* school = new School();school->addClassroom(classroom1);// 释放内存delete student1;delete student2;delete classroom1;delete school;return 0;
}/*在上述 C++ 代码中,同样实现了学生、班级和学校三个类的关系,确保每个类只与其直接朋友进行交互,遵循了迪米特法则。学生类知道自己的名字,班级类知道如何管理学生,学校类知道如何管理班级,它们之间的关系清晰明了,没有直接依赖于其他类的内部细节。这样的设计有助于降低耦合度,提高代码的可维护性和灵活性。
*/

觉得有帮助的话,打赏一下呗。。

           

相关文章:

大话设计模式之迪米特法则

迪米特法则&#xff0c;也称为最少知识原则&#xff08;Law of Demeter&#xff09;&#xff0c;是面向对象设计中的一个重要原则&#xff0c;其核心思想是降低耦合度、减少对象之间的依赖关系&#xff0c;从而使系统更加灵活、易于维护和扩展。 根据迪米特法则&#xff0c;一…...

KSD测试系统使用方法和注意事项

①下载链接在最顶部&#xff1b; ②安装方法&#xff1a;应该先将测试设备绑定在假人身上&#xff0c;测试设备不能过度往下拉&#xff0c;传感器绑在脖子上&#xff0c;切记最后才开传感器开关&#xff01;&#xff01;&#xff01;开传感器后3秒内不要碰测试设备衣服&#x…...

IT服务营销管理案例分析题

习题一 企业随着业务的蓬勃发展&#xff0c;所投入的基础设施资源不断增加。企业员工数倍数增长&#xff0c;办公场地、办公环境等要求也越来越高。 可是该企业的IT部门人员短缺&#xff0c;对IT管理还处于被动的“救火”阶段&#xff0c;每天至少15个突发故障&#xff0c;故障…...

NRF52832修改OTA升级时的bootloader蓝牙MAC

NRF52832在OTA升级时&#xff0c;修改了APP的蓝牙MAC会导致无法升级&#xff0c;原因是OTA程序的蓝牙MAC没有被修改所以手机扫描蓝牙时无法连接 解决办法 在bootloader的程序里面加入修改蓝牙mac地址的代码实现原理&#xff1a; 在bootloader蓝牙广播开启之前修改蓝牙mac 通…...

# Python 编程入门教程

欢迎来到 Python 编程入门教程!Python 是一种简单易学、功能强大的编程语言,适用于各种应用场景,从简单的脚本到大型软件开发项目。无论你是初学者还是有一定编程经验的开发者,本教程都将为你提供全面的学习路径,帮助你掌握 Python 编程的基础知识和技能。 ## 目录 1. 简…...

Sqoop【实践 02】Sqoop1最新版 全库导入 + 数据过滤 + 字段类型支持 说明及举例代码(query参数及字段类型强制转换)

Sqoop1最新版举例 1.环境说明2.import-all-tables3.query4.字段类型支持 1.环境说明 还是之前的环境&#xff1a; # 不必要信息不再贴出 # JDK [roottcloud ~]# java -version java version "1.8.0_251" # MySQL [roottcloud ~]# mysql -V mysql Ver 14.14 Distrib…...

第十四届蓝桥杯JavaA组省赛真题 - 特殊日期

解题思路&#xff1a; 暴力秒了 public class Main {public static void main(String[] args) {int cnt 0;for (int i 1900; i < 9999; i) {for (int j 1; j < 12; j) {for (int k 1; k < days(i, j); k) {if (sum(i) sum(j) sum(k)) cnt;}}}System.out.print…...

《VulnHub》Lampião:1

title: 《VulnHub》Lampio&#xff1a;1 date: 2024-03-28 21:37:49 updated: 2024-03-28 21:37:50 categories: WriteUp&#xff1a;Cyber-Range excerpt: 关键技术&#xff1a;主机发现&#xff0c;端口扫描、服务探测、操作系统探测&#xff0c;对开放的端口探测漏洞&#x…...

RabbitMq高可用

消息队列高级 服务异步通信-高级篇1.消息可靠性1.1.生产者消息确认1.2.消息持久化1.3.消费者消息确认1.4.消费失败重试机制1.5.总结 2.死信交换机2.1.初识死信交换机2.2.TTL2.3.延迟队列 3.惰性队列3.1.消息堆积问题3.2.惰性队列 4.MQ集群4.1.集群分类4.2.普通集群4.3.镜像集群…...

降本增效的车间管理大屏,车间主任看了拍手称快,速来领取。

我们老板觉得车间生产效率太低了&#xff0c;还想让我整一套车间管理的&#xff01; 制造业管理的核心在于降本增效&#xff0c;车间管理可以通过【大数据可视化】来提高管理效率&#xff0c;大屏就可以做到生产管理一「屏」了然&#xff0c;这是【车间管理大屏方案】。 一、…...

Open AI要给GPT应用开发者“发钱” 黄金的宏观关系被打破了吗?

内容摘要 为避免GPTs彻底凉凉&#xff0c;Open AI紧急启动了一项“货币化”计划&#xff0c;直接给那些在GPT Store上的应用开发人员发钱。 正文部分 当地时间周四凌晨&#xff0c;OpenAI在社交媒体上发帖称&#xff0c;正在与小部分美国开发者合作&#xff0c;基于用户使用…...

【Docker】Docker安全与最佳实践:保护你的容器化应用程序

欢迎来到英杰社区&#xff1a; https://bbs.csdn.net/topics/617804998 欢迎来到阿Q社区&#xff1a; https://bbs.csdn.net/topics/617897397 &#x1f4d5;作者简介&#xff1a;热爱跑步的恒川&#xff0c;致力于C/C、Java、Python等多编程语言&#xff0c;热爱跑步&#xff…...

QT 信号(Signal)与槽(Slot)机制

上学后,人们问我长大了要做什么,我写下“快乐”。他们告诉我,我理解错了题目,我告诉他们,他们理解错了人生。 ——约翰列侬 一、信号(signal)与槽(slot) 在QT中,信号(signal)与槽(slot)机制是一种用于对象间通信的重要机制。它允许一个对象发出信号,而其他对象…...

音频干扰检测(频域方法)

测试音响系统的通路上是否有外部干扰时&#xff0c;可以通过播放1000赫兹的正弦波信号&#xff0c;在输出端采集数字信号&#xff08;I2S&#xff0c;TDD&#xff0c;A2B&#xff09;并保存为.wav文件。 然后通过以下Python代码检测。 import numpy as np import librosa im…...

Rust引用借用 vs 原始指针

let v: i32 10; let v1 &v; let a: *const i32 &v; println!("a{:p}", a); let b a as *mut i32; //无法从&v直接转换成*mut i32&#xff0c;需要从*const i32过度 println!("b{:p}", b); unsafe {*b1; } println!("v{} v1{}"…...

抖音视频关键词无水印下载软件|手机网页视频批量提取工具

全新视频关键词无水印下载软件&#xff0c;助您快速获取所需视频&#xff01; 随着时代的发展&#xff0c;视频内容已成为人们获取信息和娱乐的重要途径。为了方便用户获取所需视频&#xff0c;推出了一款功能强大的视频关键词无水印下载软件。该软件主要功能包括关键词批量提取…...

关于Devc++调试的问题以及解决STL变量无法查看

目前Devc的调试主要有以下几点&#xff1a; 1.调试不能直接查看stl变量&#xff0c;会卡死不动 2.目前单步进入只能用鼠标键按 3.若想按下一步进入函数体内&#xff0c;要在函数体内打上断点才行 4.调试到return 0 ;上一句就停了&#xff0c;不会结束程序 5.目前F2跳至断点…...

MATLAB:优化与规划问题

一、线性规划 % 线性规划&#xff08;Linear programming, 简称LP&#xff09; fcoff -[75 120 90 105]; % 目标函数系数向量 A [9 4 7 54 5 6 105 10 8 53 8 9 77 6 4 8]; % 约束不等式系数矩阵 b [3600 2900 3000 2800 2200]; % 约束不等式右端向量 Aeq []; % 约束等式系…...

Oracal执行计划解析

概述 | Id | Operation | Name | Rows | Bytes | TempSpc | Cost (%CPU) | Time | ----------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1…...

对form表单对象中数组中的字段进行校验的方法

当对form表单中&#xff0c;数组readings中的字段进行校验时&#xff0c;prop和rules绑定要写成动态的&#xff0c;如下代码 <div v-for"(item,index) in form.readings"><el-form-item label"上次读数" > <!--prop"scds"-->…...

uniapp 对接腾讯云IM群组成员管理(增删改查)

UniApp 实战&#xff1a;腾讯云IM群组成员管理&#xff08;增删改查&#xff09; 一、前言 在社交类App开发中&#xff0c;群组成员管理是核心功能之一。本文将基于UniApp框架&#xff0c;结合腾讯云IM SDK&#xff0c;详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

Admin.Net中的消息通信SignalR解释

定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地

借阿里云中企出海大会的东风&#xff0c;以**「云启出海&#xff0c;智联未来&#xff5c;打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办&#xff0c;现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指&#xff1a;像函数调用/返回一样轻量地完成任务切换。 举例说明&#xff1a; 当你在程序中写一个函数调用&#xff1a; funcA() 然后 funcA 执行完后返回&…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

Python爬虫(二):爬虫完整流程

爬虫完整流程详解&#xff08;7大核心步骤实战技巧&#xff09; 一、爬虫完整工作流程 以下是爬虫开发的完整流程&#xff0c;我将结合具体技术点和实战经验展开说明&#xff1a; 1. 目标分析与前期准备 网站技术分析&#xff1a; 使用浏览器开发者工具&#xff08;F12&…...

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建

华为云FlexusDeepSeek征文&#xff5c;DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色&#xff0c;华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型&#xff0c;能助力我们轻松驾驭 DeepSeek-V3/R1&#xff0c;本文中将分享如何…...

Go 语言并发编程基础:无缓冲与有缓冲通道

在上一章节中&#xff0c;我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道&#xff0c;它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好&#xff0…...

Unity UGUI Button事件流程

场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...