面向对象设计原则实验“依赖倒置原则”

高层模块不应该依赖于低层模块。二者都应该依赖于抽象。抽象不应该依赖于细节。细节应该依赖于抽象。

(开闭原则、里氏代换原则和依赖倒转原则的三个实例很相似,原因是它之间的关系很紧密,在实现很多重构时通常需要同时使用这三个原则。开闭原则是目标,氏代换原则是基础,依赖倒转原则是手段。它们相辅相成,相互补充,目标一致,只是分析题时的角度不同而已)

实验一

依赖倒置可以应用于任何存在一个类向另一个类发送消息的地方。例如,Button对象和Lamp对象之间的情形。Button对象感知外部环境的变化。当接收到Poll消息时,它会判断是否被用户“按下”。它不关心是通过什么样的机制去感知的。可能是GUI上的一个按钮图标,也可能是一个能够用手指按下的真正按钮,甚至可能是一个家庭安全系统中的运动检测器。Button对象可以检测到用户激活或者关闭它。

Lamp对象会影响外部环境。当接收到TurnOn消息时,它显示某种灯光。当接收到TurnOff消息时,它把灯光熄灭。具体的物理机制并不重要。它可以是计算机控制台的LED,也可以是停车场的水银灯,甚至是激光打印机中的激光。

该如何设计一个用Button对象控制Lamp对象的系统呢?下图给出了一个不成熟的设计。Button对象接收Poll消息,判断按钮是否被按下,接着简单地发送TurnOn或者TurnOff消息给Lamp对象。

为何说它是不成熟的呢?Button类直接依赖于Lamp类。这个依赖关系意味着当

Lamp类改变时,Button类会受到影响。此外,想要重用Button来控制一个Motor对象是不可能的。在这个设计中,Button控制着Lamp对象,并且也只能控制Lamp对象。

这个方案违反了DIP。应用程序的高层策略没有和低层分离。抽象没有和具体细节分离。没有这种分离,高层策略就自动地依赖于低层模块,抽象就自动地依赖于具体细节。

请根据依赖倒置原则对上面的设计进行重构。

解析(参考):

通过倒置对 Lamp 对象的依赖关系,可以改进为一下设计:

可以看到 Button 现在和一个称为 ButtonServer 的几口关联起来。 ButtonServer 接口提供了一些抽象方, Button 可以使用这些方法来开启或者关掉一些东西。 Lamp 实现了 ButtonServer 接口。这样 Lamp 现在依赖于 ButtonServer,而不是被 Button 所依赖。

上面的设计可以让 Button 控制哪些愿意实现 ButtonServer 接口的任何设备。

实验二

某软件公司开发人员在开发 CRM 系统时发现该系统经常需要将存储在 TXT 或 Excel 文件中的客户信息转存到数据库中,因此需要进行数据格式转换。在客户数据操作类 CustomerDAO 中将调用数据格式转换类的方法来实现格式转换。初始设计方案结构如下图所示。

在编码实现上图所示的结构时,该软件公司开发人员发现该设计方案存在一个非常严重的问题。由于每次转换数据时数据来源不一定相同,因此需要经常更换数据转换类。例如:有时候需要将 TXTDataConvertor 改为 ExcelDataConvertor 。此时需要修改 CustomerDAO 的源代码,而且在引入并使用新的数据转换类时也不得不修改 CustomerDAO 的源代码。系统扩展性较差,违反了开闭原则。请使用依赖倒置原则对其进行重构。

解析(参考):

在本实验中,由于 CustomerDAO 针对具体数据转换器类编程,因此在增加新的数据转换器或者更换数据转换器时都不得不修改  CustomerDAO 的源代码。可以通过引入抽象数据转换类解决该问题。此时 CustomerDAO 将针对抽象数据转换类编程,程而可以将具体数据转换类类名存储在配置文件中,,需要更改时无需修改源代码,只需要修改配置文件即可。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【智能优化算法详解】粒子群算法PSO量子粒子群算法QPSO

1.粒子群算法PSO 博主言简意赅总结-算法思想:大方向下个体自学习探索群体交流共享 对比适应度找到最优点 背景 粒子群算法,也称粒子群优化算法或鸟群觅食算法(Particle Swarm Optimization), 缩写为 PSO。粒子群…

HarmonyOS实战开发-如何实现文件管理相关的功能。

介绍 本示例主要展示了文件管理相关的功能,使用ohos.multimedia.medialibrary 、ohos.filemanagement.userFileManager 、ohos.fileio 、ohos.file.fs、ohos.app.ability.contextConstant 等接口,实现了增添文件、删除文件、查找指定类型文件文件、复制…

2024年MathorCup+认证杯数模竞赛思路预定与助攻计划

2024年的第14届“妈妈杯”与认证杯即将启动,云顶数模将团队众多国奖学长学姐将再次为大家精心准备的高质量解题思路、参考代码等,帮助大家在妈妈杯获得理想的成绩,也为国赛奠定坚实基础!! 小云也为大家提供了本周末两场…

安装selenium和关于chrome高版本对应的driver驱动下载安装【Win/Mac 】

目录 一、查看自己电脑上chrome的版本 二、下载 ChromeDriver 三、安装selenium 法一:打开pycharm,点击File,Setting进入配置页面,点击Project下面的Python Interpreter进入环境配置页面,点击。输入selenium。之后…

【太阳能控制器升压芯片方案】DC-DC异步升压恒压外置MOS芯片FP5207 主要应用于太阳能灯带、太阳能路灯/投光灯等市场

随着社会经济的发展,能源危机与生态环境问题日趋严重,大力发展可再生能源已经成为当今世界的必然趋势。太阳能作为取之不尽、清洁干净的资源,已成为世界各国研究开发的热点。光伏发电具有技术成熟、产业化程度高的特点,受到世界各…

一、幼儿园校园广播系统(IP网络广播)建设背景

幼儿园为给儿童提供优雅的学习生活环境,园领导决定建设一套幼儿园校园广播(IP网络广播)系统。 二、幼儿园校园广播系统(IP网络广播)简述 幼儿园校园广播系统(IP网络广播),采用“技…

Linux第88步_非阻塞IO实验

非阻塞IO是“应用程序”对“驱动设备”进行操作,若不能获取到设备资源,则非阻塞IO应用程序的线程不会被“挂起”,即线程不进入休眠,而是一直“轮询”,直到获取到设备资源为止,或者直接放弃。 非阻塞IO应用举…

[计算机效率] 鼠标手势工具:WGestures(解放键盘的超级效率工具)

3.22 鼠标手势工具:WGestures 通过设置各种鼠标手势和操作进行绑定。当用户通过鼠标绘制出特定的鼠标手势后就会触发已经设置好的操作。有点像浏览器中的鼠标手势,通过鼠标手势操纵浏览器做一些特定的动作。这是一款强大的鼠标手势工具,可以…

大语言模型:红蓝对抗的工作原理及作用

您是否对强大的生成式AI领域心生好奇,却又担心随之而来的潜在漏洞?您只需了解红蓝对抗就好了,它也称为破解或提示注入。AI开发的这一关键环节往往被忽视,但其在提高生成式AI模型的性能方面发挥的作用却至关重要。 大语言模型&…

TFT显示屏驱动

REVIEW 已经学习过VGA 时序与实现-CSDN博客 VGA 多分辨率-CSDN博客 今天就来让TFT屏显示一下 小梅哥视频:24 RGB TFT显示屏原理与驱动实现_哔哩哔哩_bilibili 1. 设置显示屏参数与时钟 注意到VGA_parameter.v中,不懂得分辨率对应于不同的频率&#xff…

基于springboot实现洗衣店订单管理系统项目【项目源码+论文说明】

基于springboot实现洗衣店订单管理系统演示 摘要 随着信息互联网信息的飞速发展,无纸化作业变成了一种趋势,针对这个问题开发一个专门适应洗衣店业务新的交流形式的网站。本文介绍了洗衣店订单管理系统的开发全过程。通过分析企业对于洗衣店订单管理系统…

Golang | Leetcode Golang题解之第20题有效的括号

题目&#xff1a; 题解&#xff1a; func isValid(s string) bool {n : len(s)if n % 2 1 {return false}pairs : map[byte]byte{): (,]: [,}: {,}stack : []byte{}for i : 0; i < n; i {if pairs[s[i]] > 0 {if len(stack) 0 || stack[len(stack)-1] ! pairs[s[i]] {…

甘特图在生产进度管理中的应用

生产进度管理在生产制造过程中起着至关重要的作用。 它主要关注对生产进程的掌控和安排&#xff0c;确保生产活动能够按照预定的计划和时间顺利进行&#xff0c;以达到按时交付产品的目标。 在生产进度管理中&#xff0c;首先需要制定一个详细且合理的生产计划&#xff0c;明…

深度学习学习日记4.7

1.梯度下降 w 新 w旧 - 学习率梯度 训练的目的就是让 loss 减小 2.前向传播进行预测&#xff0c; 反向传播进行训练(每一个参数通过梯度下降进行更新参数)&#xff0c;(1前向传播 2求 loss 3反向传播 4梯度更新) 能够让损失下降的参数&#xff0c;就是更好的参数。 损失…

太赫兹探测器是太赫兹技术应用核心器件之一 我国研究成果不断增多

太赫兹探测器是太赫兹技术应用核心器件之一 我国研究成果不断增多 太赫兹探测器&#xff0c;是太赫兹&#xff08;THz&#xff09;应用的基础&#xff0c;是太赫兹成像、太赫兹通信等系统的核心器件&#xff0c;其性能直接决定太赫兹系统的优劣&#xff0c;地位极为重要&#x…

TiDB 组件 GC 原理及常见问题

本文详细介绍了 TiDB 的 Garbage Collection&#xff08;GC&#xff09;机制及其在 TiDB 组件中的实现原理和常见问题排查方法。 TiDB 底层使用单机存储引擎 RocksDB&#xff0c;并通过 MVCC 机制&#xff0c;基于 RocksDB 实现了分布式存储引擎 TiKV&#xff0c;以支持高可用分…

3.Requests库使用

目录 概述实践代码执行结果代码结果官网文档 概述 实践 代码 # 1.关于urllib3的一个简单使用 from urllib.parse import urlparse import urllib3pool_manager urllib3.PoolManager() test_url "http://10.32.44.103:9999/process-business/qan/page?page1&size…

Web后端搭建

目录 一 搭建服务器端 1.1安装服务器软件 1.2检查环境是否配置 1.3安装Tomcat 二 创建并发Web项目 2.1创建一个java项目 三 创建Servlet 前端程序如何才能访问到后端程序呢&#xff0c;这时候我们就需要web服务器来解决&#xff1a;将后端程序部署到服务器中&#xff0c…

2024电力、电网与智能应用技术国际学术会议(ICPGIAT2024)

2024电力、电网与智能应用技术国际学术会议(ICPGIAT2024) 会议简介 2024年国际电力、电网和智能应用技术大会&#xff08;ICPGIAT 2024&#xff09;将在中国杭州举行&#xff0c;就“电力系统”、“智能控制”和“智能应用技术”等研究主题进行讨论和交流。会议围绕智能系统…

linux(ub)-redis环境部署

1.下载redis包 wget http://download.redis.io/releases/redis-7.0.5.tar.gz 2.解压缩&#xff1a; tar -zxvf redis-7.0.5.tar.gz 3.安装gcc&#xff1a;sudo apt-get install gcc 4. 编译&#xff1a;cd redis-7.0.5 make make make install 5. cd /usr/local/bin/ 6. mkdir …