C++ 设计原则 - 依赖倒置原则

C++ 中的依赖倒置原则(Dependency Inversion Principle,DIP)是SOLID设计原则中的一部分,它要求高层模块不应该依赖于低层模块,二者都应该依赖于抽象;而抽象不应该依赖于具体实现细节,具体实现细节应该依赖于抽象。这一原则可以通过使用抽象类和接口来实现。

通过一个简单的示例来说明依赖倒置原则的实现。假设有一个电脑类(Computer)需要连接各种外部设备,例如键盘(Keyboard)和鼠标(Mouse)。我们可以按照依赖倒置原则进行设计和实现。

// 抽象接口
class IDevice 
{
public:virtual void use() = 0;
};// 鼠标类
class Mouse : public IDevice{
public:void use() override{cout << "mouse being used" << endl;}
};// 键盘类
class Keyboard : public IDevice 
{
public:void use() override {cout << "keyboard being used" << endl;}
};// 电脑类
class Computer 
{
private:IDevice* device;public:Computer(IDevice* dev) : device(dev) {}void useDevice() {device->use(); // 不依赖于具体的鼠标或键盘类型,而是依赖于抽象接口IDevice}
};

例子中,Computer 类不直接依赖于具体的鼠标或键盘类,而是依赖于抽象接口 IDevice。这样,无论将来增加了新的外部设备,只需要基于IDevice接口实现新的设备类,而无需修改Computer类的代码。

这种实现方式遵循了依赖倒置原则:高层模块(Computer)不依赖于底层模块(具体的鼠标或键盘类),而是都依赖于抽象(IDevice 接口)。这使得代码更加灵活,易于扩展和维护。

/
程序需要扩展或维护时,依赖倒置原则可以帮助我们以一种灵活的方式进行改进,而不会对现有的代码造成影响。

通过一个例子来说明:
给电脑类(Computer)增加一个新的外部设备,比如打印机(Printer),根据依赖倒置原则的设计,我们可以轻松地实现这一扩展。

首先,我们创建一个新的打印机类,实现 IDerice 接口:

// 打印机类
class Printer : public IDevice 
{
public:void use() override {cout << "printer being used" << endl;}
};

然后,我们对 Computer 类进行扩展,将新的打印机设备传入:

int main() 
{// 现有的设备Mouse mouse;Keyboard keyboard;// 创建电脑对象并使用现有的设备Computer computer1(&mouse);computer1.useDevice(); // 输出: mouse being usedComputer computer2(&keyboard);computer2.useDevice(); // 输出: keyboard being used// 程序扩展:添加打印机设备Printer printer;Computer computer3(&printer);computer3.useDevice(); // 输出: printer being usedreturn 0;
}

通过这样的扩展,在不修改现有代码的情况下,实现了对新设备的支持。这正是依赖倒置原则的优势所在:高层模块不依赖于具体的底层模块,而是依赖于抽象接口;抽象不依赖细节,细节应依赖抽象;,从而使得系统更加灵活,易于扩展和维护。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/148866.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

08.智慧商城——购物车布局、全选反选、功能实现

01. 购物车 - 静态布局 基本结构 <template><div class"cart"><van-nav-bar title"购物车" fixed /><!-- 购物车开头 --><div class"cart-title"><span class"all">共<i>4</i>件商品…

记录一次macos没有sudoers文件问题

问题&#xff1a;但我输入sudo visudo sudo: unable to stat /etc/sudoers: No such file or directory sudo: no valid sudoers sources found, quitting sudo: error initializing audit plugin sudoers_audit解决: 此文件不存在 su root # 现在我能登录root touch /etc/su…

10-19 HttpServletResponse

相应的对象 web开发模型&#xff1a;基于请求与相应的模型 一问一答的模型 Response对象:响应对象,封装服务器给客户端的相关的信息 顶级接口: ServletResponse 父接口:HttpServletResponse response对象的功能分为以下四种:(都是服务器干的事注意) 设置响应头信息; 发送状态码…

EtherCAT主站SOEM -- 6 -- SOEM之ethercatcoe.h/c(ethercateoe/foe/soe)文件解析

EtherCAT主站SOEM -- 6 -- SOEM之ethercatcoe.h/c-ethercateoe/foe/soe 0 COE,EOE,FOE,SOE区别:0.1 ehercatcoe.h/c,ethercateoe.h/c,ethercatfoe.h/c及ethercatsoe.h/c一 ethercatcoe.h/c文件功能预览:二 ethercatcoe.h/c 文件的主要函数的作用:2.1.1 void ec_SDOerro…

Vue2基础-Vue对象进阶介绍1

文章目录 一、绑定样式绑定class样式绑定style样式总结 二、渲染条件渲染列表渲染语法key详解 三、Vue检测数据原理问题解决 四、收集表单数据五、过滤器定义语法: 六、内置指令回顾v-text指令:v-htmlcookie问题 v-clock指令v-oncev-pre 一、绑定样式 绑定class样式 <!-- …

使用Flink处理Kafka中的数据_题库子任务_Java语言实现

2024年职业院校技术大赛-高职大数据应用开发赛项专题。 使用Flink处理Kafka中的数据_题库子任务1、2、3_Java语言实现使用Flink处理Kafka中的数据_题库子任务4、5、6_Java语言实现使用Flink处理Kafka中的数据_题库子任务7、8、9_Java语言实现

互联网摸鱼日报(2023-11-20)

互联网摸鱼日报(2023-11-20) 36氪新闻 2023年11月山东新三板企业市值TOP100&#xff1a;21家企业冲击北交所 2024年企业数字化转型工作展望 本周双碳大事&#xff1a;中美发表阳光之乡声明&#xff1b;CCER三大配套制度发布&#xff1b;国鸿氢能通过港交所上市聆讯 基因编辑…

python脚本获取cookie写入本地

自己负责的一个项目接口有token验证&#xff0c;登录功能&#xff08;获取token&#xff09;是相当于一个通用的第三方&#xff0c;点击登录按钮跳转公共的登录平台&#xff0c;登录完后再跳转回来。所以导致本地开发的时候&#xff0c;无法登录完后&#xff0c;直接跳回本地页…

SpringCloud-Gateway修改Response响应体,并解决大数据量返回不全等问题

官网相关案例&#xff1a; Spring Cloud Gatewayhttps://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#the-modifyresponsebody-gatewayfilter-factory ModifyRequestBodyGatewayFilterFactory类: https://github.com/spring-cloud/spring-cloud-gate…

Virtual安装centos后,xshell连接centos

1. 网络使用Host-Only模式动态分配IP&#xff0c;点确定后&#xff0c;centos 上运行 system restart network &#xff0c;使用ifconfig查看新的ip&#xff0c;XShell可以直接连上centos&#xff0c; 但是由于使用的是Host-Only模式&#xff0c;centos不能访问网络&#xff0c…

【解锁未来】OpenAI:从创始到GPT4的发展

文章目录 创始发展GPT-4的发布 创始 让我们回到2015年&#xff0c;当时一群有远见的科技领袖&#xff0c;包括山姆柯曼、伊隆马斯克等人&#xff0c;共同创立了OpenAI。他们希望通过OpenAI&#xff0c;推动人工智能的发展&#xff0c;同时确保这项技术能够造福全人类。 发展 …

​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​

软考-高级-系统架构设计师教程&#xff08;清华第2版&#xff09;【第9章 软件可靠性基础知识&#xff08;P320~344&#xff09;-思维导图】 课本里章节里所有蓝色字体的思维导图

解决在pycharm中使用matplotlib画图问题

第一&#xff0c;再导入包后直接绘图出现&#xff1a; AttributeError: module backend_interagg has no attribute FigureCanvas表明版本不兼容&#xff0c;我们需要加入&#xff1a;matplotlib.use(‘TkAgg’) 导入函数就变成了&#xff1a; import matplotlib matplotlib.…

JAXB的XmlElement注解

依赖 如果基于JAX-WS开发&#xff0c;可以在maven工程的pom.xml文件中增加如下依赖&#xff0c;会将依赖的JAXB库也下载下来&#xff1a; <dependency><groupId>jakarta.xml.ws</groupId><artifactId>jakarta.xml.ws-api</artifactId><vers…

Django_学习_02

路由系统 urls 视图 views 模板 TempLates 静态文件和媒体文件 static 中间件 middleware ORM databases 1.路由系统 a.传统路…

基础课8——中文分词

中文分词指的是将一个汉字序列切分成一个一个单独的词。分词就是将连续的字序列按照一定的规范重新组合成词序列的过程。在英文的行文中&#xff0c;单词之间是以空格作为自然分界符的&#xff0c;而中文只是字、句和段能通过明显的分界符来简单划界&#xff0c;唯独词没有一个…

开源与闭源:创新与安全的平衡

目录 一、开源和闭源的优劣势比较 一、开源软件的优劣势 优势 劣势 二、闭源软件的优劣势 优势 劣势 二、开源和闭源对大模型技术发展的影响 一、机器学习领域 二、自然语言处理领域 三、数据共享、算法创新与业务拓展的差异 三、开源与闭源的商业模式比较 一、盈…

C#入门(10):集合用法介绍

在C#中&#xff0c;集合是一种特殊的数据类型&#xff0c;允许我们将多个元素组织在一起。这些元素可以是相同的类型或者可以是不同的类型。C#集合主要包括以下几种类型&#xff1a; List&#xff1a;它是一个有序的元素列表&#xff0c;用户可以添加、删除或查找元素。Dictio…

【数据结构】详解链表结构

目录 引言一、链表的介绍二、链表的几种分类三、不带头单链表的一些常用接口3.1 动态申请一个节点3.2 尾插数据3.3 头插数据3.4 尾删数据3.5 头删数据3.6 查找数据3.7 pos位置后插入数据3.8 删除pos位置数据3.9 释放空间 四、带头双向链表的常见接口4.1创建头节点&#xff08;初…

220V交流转直流的简易电源设计

220V交流转直流的简易电源设计 设计简介设计原理电路图变压器电路交流转直流电路3.3V电源接口电路 PCB3D图 实践检验 设计简介 通过模拟电路的相关知识&#xff0c;尝试将220V的交流电转化为我们指定电压的直流电。 设计原理 将220V交流电转化为直流电的方法常用的有通过变压器…