在面向对象设计中,如何通过很小的设计改变就可以应对设计需求的变化,这是令设计者极为关注的问题。为此不少OO先驱提出了很多有关面向对象的设计原则用于指导OO的设计和开发。下面是几条与类设计相关的设计原则。
1. 开闭原则(the Open Closed Principle OCP) 一个模块在扩展性方面应该是开放的而在更改性方面应该是封闭的。因此在进行面向对象设计时要尽量考虑接口封装机制、抽象机制和多态技术。该原则同样适合于非面向对象设计的方法,是软件工程设计方法的重要原则之一。
我们以收音机的例子为例,讲述面向对象的开闭原则。我们收听节目时需要打开收音机电源,对准电台频率和进行音量调节。但是对于不同的收音机,实现这三个步骤的细节往往有所不同。比如自动收缩电台的收音机和按钮式收缩在操作细节上并不相同。因此,我们不太可能针对每种不同类型的收音机通过一个收音机类来实现(通过重载)这些不同的操作方式。但是我们可以定义一个收音机接口,提供开机、关机、增加频率、降低频率、增加音量、降低音量六个抽象方法。不同的收音机继承并实现这六个抽象方法。这样新增收音机类型不会影响其它原有的收音机类型,收音机类型扩展极为方便。此外,已存在的收音机类型在修改其操作方法时也不会影响到其它类型的收音机。
图1是一个应用OCP生成的收音机类图的例子:
图1 OCP应用(收音机)
2. 替换原则 (the Liskov Substitution Principle LSP) 子类应当可以替换父类并出现在父类能够出现的任何地方。这个原则是Liskov于1987年提出的设计原则。它同样可以从Bertrand Meyer 的DBC (Design by Contract) 的概念推出。
我们以学生为例,夜校生为学生的子类,因此在任何学生可以出现的地方,夜校生均可出现。这个例子有些牵强,一个能够反映这个原则的例子时圆和椭圆,圆是椭圆的一个特殊子类。因此任何出现椭圆的地方,圆均可以出现。但反过来就可能行不通。
Liskov的相关图示见图2:
图2 Liskov 原则
运用替换原则时,我们尽量把类B设计为抽象类或者接口,让C类继承类B(接口B)并实现操作A和操作B,运行时,类C实例替换B,这样我们即可进行新类的扩展(继承类B或接口B),同时无须对类A进行修改。
3. 依赖原则 (the Dependency Inversion Principle DIP) 在进行业务设计时,与特定业务有关的依赖关系应该尽量依赖接口和抽象类,而不是依赖于具体类。具体类只负责相关业务的实现,修改具体类不影响与特定业务有关的依赖关系。
在结构化设计中,我们可以看到底层的模块是对高层抽象模块的实现(高层抽象模块通过调用底层模块),这说明,抽象的模块要依赖具体实现相关的模块,底层模块的具体实现发生变动时将会严重影响高层抽象的模块,显然这是结构化方法的一个"硬伤"。
面向对象方法的依赖关系刚好相反,具体实现类依赖于抽象类和接口(见图-3)。
为此,我们在进行业务设计时,应尽量在接口或抽象类中定义业务方法的原型,并通过具体的实现类(子类)来实现该业务方法,业务方法内容的修改将不会影响到运行时业务方法的调用。
图3依赖原则图示
4. 接口分离原则(the Interface Segregation Principle ISP) 采用多个与特定客户类有关的接口比采用一个通用的涵盖多个业务方法的接口要好。
ISP原则是另外一个支持诸如COM等组件化的使能技术。缺少ISP,组件、类的可用性和移植性将大打折扣。
这个原则的本质相当简单。如果你拥有一个针对多个客户的类,为每一个客户创建特定业务接口,然后使该客户类继承多个特定业务接口将比直接加载客户所需所有方法有效。
图4展示了一个拥有多个客户的类。它通过一个巨大的接口来服务所有的客户。只要针对客户A的方法发生改变,客户B和客户C就会受到影响。因此可能需要进行重新编译和发布。这是一种不幸的做法。
图4 带有集成接口的服务类
我们再看图-5中所展示的技术。每个特定客户所需的方法被置于特定的接口中,这些接口被Service类所继承并实现。
图5 使用接口分离的服务类设计
如果针对客户A的方法发生改变,客户B和客户C并不会受到任何影响,也不需要进行再次编译和重新发布。
以上四个原则是面向对象中常常用到的原则。此外,除上述四原则外,还有一些常用的经验诸如类结构层次以三到四层为宜、类的职责明确化(一个类对应一个具体职责)等可供我们在进行面向对象设计参考。但就上面的几个原则看来,我们看到这些类在几何分布上呈现树型拓扑的关系,这是一种良好、开放式的线性关系、具有较低的设计复杂度。一般说来,在软件设计中我们应当尽量避免出现带有闭包、循环的设计关系,它们反映的是较大的耦合度和设计复杂化。
相关推荐
该项目包含完整的前后端代码、数据库脚本和相关工具,简单部署即可运行。功能完善、界面美观、操作简单,具有很高的实际应用价值,非常适合作为Java毕业设计或Java课程设计使用。 所有项目均经过严格调试,确保可运行!下载后即可快速部署和使用。 1 适用场景: 毕业设计 期末大作业 课程设计 2 项目特点: 代码完整:详细代码注释,适合新手学习和使用 功能强大:涵盖常见的核心功能,满足大部分课程设计需求 部署简单:有基础的人,只需按照教程操作,轻松完成本地或服务器部署 高质量代码:经过严格测试,确保无错误,稳定运行 3 技术栈和工具 前端:HTML + Vue.js 后端框架:Spring Boot 开发环境:IntelliJ IDEA 数据库:MySQL(建议使用 5.7 版本,更稳定) 数据库可视化工具:Navicat 部署环境:Tomcat(推荐 7.x 或 8.x 版本),Maven
单片机仿真在电子工程和计算机科学领域中扮演着重要的角色,它允许开发者在实际硬件构建之前测试和验证他们的设计。Proteus是一款强大的单片机仿真软件,它结合了电路设计、模拟仿真和编程调试等多种功能,为单片机项目开发提供了便捷的平台。在这个“单片机仿真Proteus实例4X4键盘”的教程中,我们将深入探讨如何使用Proteus进行4X4矩阵键盘的仿真。 4X4键盘是一种常见的输入设备,常用于嵌入式系统和小型电子设备中。它由4行4列共16个按键组成,通过矩阵扫描方式实现键值的识别。在Proteus中模拟4X4键盘,首先需要搭建硬件电路模型。这包括连接按键到单片机的输入引脚,通常使用I/O口来读取按键状态。每个按键对应一个行线和一个列线,当按键按下时,行线和列线将短路,单片机通过检测这些短路来确定哪个键被按下。 在Proteus中,我们可以通过库搜索并添加所需的元器件,如74HC138译码器(用于驱动列线)和74HC238译码器(用于驱动行线),以及单片机(如AT89C51或类似的微控制器)和。内容来源于网络分享,如有侵权请联系我删除。另外如果没有积分的同学需要下载,请私信我。
花生好坏缺陷识别数据集,7262张图片,支持yolov7格式的标注,识别准确率在95.7% 两种标签: Good,Bad 花生好坏缺陷识别数据集,7262张图片,支持yolo,coco json,pasical voc xml格式的标注,识别准确率在95.7% 详情查看地址:https://backend.blog.csdn.net/article/details/144983881
使用ortools排产建模示例
Prime_Series_Level-1.z04 别下,这个是分卷压缩,笔者用来备份的
【8项合集】12月最新JavaGuide 面试指北 代码随想录八股文 面经 【8项全部打包】 【最新面试指北 + JavaGuide + 最新代码随想录八股文 + 50万字Java面试宝典 + Java高频面试题199解答 + Java一站式搞定技术项目面 + 大厂核心体系题 + 24大厂面试题第4季】 1. Java面试指北 2024 12月最新版 2. JavaGuide面试大全 3. 代码随想录最强八股文(第5版)最新合集 4. 2024大厂面试题(第4季) 5. 2024 Java面试宝典合集 6. 2024 Java高频面试题199个 7. 2024 一站式搞定Java技术和项目面试 8. Java大厂面试核心体系题
该项目包含完整的前后端代码、数据库脚本和相关工具,简单部署即可运行。功能完善、界面美观、操作简单,具有很高的实际应用价值,非常适合作为Java毕业设计或Java课程设计使用。 所有项目均经过严格调试,确保可运行!下载后即可快速部署和使用。 1 适用场景: 毕业设计 期末大作业 课程设计 2 项目特点: 代码完整:详细代码注释,适合新手学习和使用 功能强大:涵盖常见的核心功能,满足大部分课程设计需求 部署简单:有基础的人,只需按照教程操作,轻松完成本地或服务器部署 高质量代码:经过严格测试,确保无错误,稳定运行 3 技术栈和工具 前端:HTML + Vue.js 后端框架:Spring Boot 开发环境:IntelliJ IDEA 数据库:MySQL(建议使用 5.7 版本,更稳定) 数据库可视化工具:Navicat 部署环境:Tomcat(推荐 7.x 或 8.x 版本),Maven
该项目包含完整的前后端代码、数据库脚本和相关工具,简单部署即可运行。功能完善、界面美观、操作简单,具有很高的实际应用价值,非常适合作为Java毕业设计或Java课程设计使用。 所有项目均经过严格调试,确保可运行!下载后即可快速部署和使用。 1 适用场景: 毕业设计 期末大作业 课程设计 2 项目特点: 代码完整:详细代码注释,适合新手学习和使用 功能强大:涵盖常见的核心功能,满足大部分课程设计需求 部署简单:有基础的人,只需按照教程操作,轻松完成本地或服务器部署 高质量代码:经过严格测试,确保无错误,稳定运行 3 技术栈和工具 前端:HTML + Vue.js 后端框架:Spring Boot 开发环境:IntelliJ IDEA 数据库:MySQL(建议使用 5.7 版本,更稳定) 数据库可视化工具:Navicat 部署环境:Tomcat(推荐 7.x 或 8.x 版本),Maven
vue.min.js下载
Docker是一个开源的应用容器引擎,它通过操作系统级的虚拟化技术(如Linux上的命名空间和控制组)来创建和管理轻量级的、可移植的软件容器。这些容器能够在不同的主机之间无缝运行,并且具备一致的行为,因为它们包含了应用运行所需的所有依赖库、配置文件和服务。 Docker的主要资源包括Docker镜像、Docker容器和Docker仓库。Docker镜像是静态的、只读的模板,包含了运行一个应用程序所需的所有内容。Docker容器则是基于Docker镜像创建的一个轻量级、独立的运行环境,是Docker技术的核心运行时实体。Docker仓库则用于存储和分发Docker镜像,有公共和私有两种形式。 关于Docker的项目源码,通常镜像本身并不直接包含源码,因为镜像主要用于打包和运行应用程序及其依赖项。然而,如果你需要查看某个运行在Docker容器中的应用程序的源码,有几种方法可以实现。一种方法是通过容器挂载本地目录,将项目的源码文件映射到容器内。另一种方法是使用docker exec命令进入运行中的容器,然后在容器内查找并查看源码。通常,项目的源码会存放在特定的目录中,你可以通过查找Doc
煤层气开采热力流(thm)耦合案列讲解
内容概要:本文由一位汽车电子工程师撰写,主要探讨了两种常见数据格式——ARXML和JSON的区别及各自特点,并详细解释了为何在 AUTOSAR 标准中选用 ARXML而非JSON。首先阐述了 JSON 与 XML 的优缺点,并对比两者的应用场景,尤其针对Web环境以及复杂的文档描述和企业应用服务。接着深入讨论了 AUTOSAR 使用 ARXML 文件的关键理由:强大的复杂数据结构表达、严格的验证约束、与现有工具链的良好兼容性、高度扩展性的特性以及标准化和支持大型项目的性能。最后强调对于车载软件工程师来说,熟悉这两类文件是非常重要的,同时也提供了进一步学习 JSON 和 XML 的参考资料。 适用人群:面向汽车行业软件工程从业人员,特别是负责 AUTOSAR 系统设计与实现的研发工程师和技术爱好者。 使用场景及目标:有助于读者理解为什么在汽车行业中选择了 ARXML 而非 JSON 来承载 AUTOSAR 接口交互任务。同时帮助开发者掌握不同环境下选择恰当数据格式的基本原则。 其他说明:作者是一名有着丰富实践经验的汽车电子工程师,文中不仅涉及到技术细节的分析,还包括个人从业体会的心得感悟,表达了对未来技术发展的期待和个人信念。
基于STM32开发变频器-企业级成熟量产方案 包含:变频控制板-原理图、PCB 变频逆变器功率板-原理图 PCB 控制板源代码+硬件设计说明书+软件设计说明书。 变频逆变器功率板 硬件设计说明书+总体设计说明书+辅助电源变压器 额定输入电压:DC110V 输入电压范围:DC77-137.5V 电压:200V±5%(200VAC~240VAC可调) 频率: 42Hz±0.5Hz(35-50可调) 额定输出容量:1.3kW 1.55kVA 工作温度:-25℃~+70℃ 相对湿度:≤100%(不结露) 海拔:≤2500m 输出电压波形:正弦波
Java基于springboot+vue的电影院管理系统源码+数据库(高分项目),个人大三大作业设计项目、经导师指导并认可通过的高分设计项目,评审分99分,代码完整确保可以运行,小白也可以亲自搞定,主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者,也可作为课程设计、期末大作业。 Java基于springboot+vue的电影院管理系统源码+数据库(高分项目)Java基于springboot+vue的电影院管理系统源码+数据库(高分项目)Java基于springboot+vue的电影院管理系统源码+数据库(高分项目)Java基于springboot+vue的电影院管理系统源码+数据库(高分项目)Java基于springboot+vue的电影院管理系统源码+数据库(高分项目)Java基于springboot+vue的电影院管理系统源码+数据库(高分项目)Java基于springboot+vue的电影院管理系统源码+数据库(高分项目)Java基于springboot+vue的电影院管理系统源码+数据库(高分项目)Java基于springboot+vue的电影院管理系统源码
永磁同步电机双矢量占空比模型预测转矩控制mptc,考虑全局最优占空比选择,使得全局占空比基本都小于1,仿真波形效果不错,有word文档解析。
该项目包含完整的前后端代码、数据库脚本和相关工具,简单部署即可运行。功能完善、界面美观、操作简单,具有很高的实际应用价值,非常适合作为Java毕业设计或Java课程设计使用。 所有项目均经过严格调试,确保可运行!下载后即可快速部署和使用。 1 适用场景: 毕业设计 期末大作业 课程设计 2 项目特点: 代码完整:详细代码注释,适合新手学习和使用 功能强大:涵盖常见的核心功能,满足大部分课程设计需求 部署简单:有基础的人,只需按照教程操作,轻松完成本地或服务器部署 高质量代码:经过严格测试,确保无错误,稳定运行 3 技术栈和工具 前端:HTML + Vue.js 后端框架:Spring Boot 开发环境:IntelliJ IDEA 数据库:MySQL(建议使用 5.7 版本,更稳定) 数据库可视化工具:Navicat 部署环境:Tomcat(推荐 7.x 或 8.x 版本),Maven
大数据lzo压缩库,jar包格式
:Android 天气应用开发 在Android平台上,创建一个天气应用程序是一个常见的学习项目,也是期末大作业的理想选择,因为它涵盖了多个关键的技术点,包括网络请求、数据解析、UI设计以及地理位置服务等。本项目旨在帮助学生深入理解Android应用开发流程,提升实战技能。 :Android期末大作业必备 这个项目适合作为Android开发课程的期末大作业,因为它要求开发者具备一定的基础,例如对Android Studio的使用、XML布局设计、Java或Kotlin编程语言的掌握,以及对Android SDK的理解。通过完成这个项目,学生可以巩固课堂所学,同时提高独立解决问题的能力。 :Android Android是Google主导的开源移动操作系统,广泛应用于智能手机和平板电脑。开发Android应用需要使用Android Studio IDE,学习Android SDK,理解Android组件(如Activity、Intent、Service等),以及掌握XML和Java/Kot。内容来源于网络分享,如有侵权请联系我删除。另外如果没有积分的同学需要下载,请私信我。
音视频相关的OPENCV库,嵌入式Linux,ARM32平台,已使用32位arm-linux-gnueabihf编译链进行编译,可直接使用; 包含include/lib/bin等文件夹,内含动静态库,头文件,ffmpeg或ffplay命令等
COMSOL超声无损tfm,saft,全聚焦,合成孔径模型,单模型 模型介绍:本链接有两个模型,分别使用压力声学与固体力学进行仿真,副有模型说明。 使用者可自定义阵元数、激发频率、接收阵元等参数,仿真过程不用切激发阵元,一键激发,一次性接收信号 为什么要做两个模型,固体力学会产生波形转,波形交乱,压力声学波速是恒定(一般为纵波),两种波形成像效果不一样,可以做对比。 版本为6.0,低于6.0的版本打不开此模型