设计模式 - 七大软件设计原则

news2024/11/18 17:33:52

目录

一、设计模式

1.1、软件设计原则

1.1.1、开闭原则

1.2.2、单一职责原则

1.2.3、里氏替换原则

1.2.4、迪米特原则

1.2.5、接口隔离原则

1.2.6、依赖倒转原则

1.2.7、合成/聚合复用原则


一、设计模式


1.1、软件设计原则

1.1.1、开闭原则

开闭原则:对扩展开放,对修改关闭,也就是说,尽量在不修改原有代码的情况下进行扩展.

通俗来讲,开闭原则就是告诉我们,不要取修改已经完成的程序,而是在原有的基础上进行扩展. 比如在 Java 中,我们设计程序的时候,不要写死,要留有接口,将来如果有什么需要进行扩展,直接在原有的接口上进行开发.

好处:当软件面临新的需求时,可以非常方便的在不修改原有代码的前提下进行扩展,使得软件具有更好的扩展,同时降低维护的成本.

1.2.2、单一职责原则

单一职责原则:一个类只负责一个功能领域中相应的职责.

通俗来讲,单一职责原则就是告诉我们,一个类不能太“累”.  在一个系统中,如果一个类承担的责任的越多,那么他被复用的可能性越小,耦合度很高.  所以我们在设计程序的时候就因该将这些职责封装到不同的类中.

好处:高内聚,低耦合.

1.2.3、里氏替换原则

里氏替换原则:继承必须保证父类所拥有的性质在子类中必须成立.

通俗来讲,里氏替换原则就是告诉我们,子类可以扩展父类的功能,但不能改变父类原有的功能.   也就是说,子类在继承父类的时候,除了添加新的方法用来扩展功能以外,尽量不要重写父类的方法.

子类重写父类方法虽然写起来很方便,但是继承体系的复用性就会很差,特别时多态运用频繁时,程序出错的概论就会很大.  如果不得不违背里氏替换原则,那么建议 “取消原来的继承关系,重新设计他们之间的关系”.

好处:里氏替换时实现开闭原则的重要方式之一; 降低类扩展时给已有的程序造成错误的概率,加强了程序的健壮性,可维护性、可扩展性.

1.2.4、迪米特原则

迪米特原则:一个类应当尽可能少和其他类发生相互作用.  

通俗来讲,就是要求我们在设计软件的时候,尽量减少类之间的交互,如果两个类不彼此直接通信,那么这两个类就不应当直接的相互作用.  如果其中一个类需要调用另一个类的方法,可以通过第三者转发这个调用(通过第三者来降低对象之间的耦合度).

这就好比,在电脑关机的时候,直接点击关机按钮,此时就会关闭其他的运行程序,然后才关闭电源.

好处:降低类之间的耦合,提高代码的复用.

1.2.5、接口隔离原则

接口隔离原则:客户端不因该依赖它不需要的接口,一个类对另一个类的依赖应该建立在最小接口上.  也就是说 接口的实现类尽量减少不必要的实现,可以把接口分开. 

通俗来讲,就是说当一个接口太大时,我们需要将他分割成一些小的接口.  每一个接口只需要包含一个客户端(如子模块或者业务逻辑类)所需的方法接口,也叫“定制服务”.

好处:加你个庞大的接口分解成多个粒度小的接口,提高系统的灵活性和可维护性.

1.2.6、依赖倒转原则

依赖倒转原则:高层模块不应该依赖底层模块,二者都因该依赖其抽象;抽象不因该依赖细节,细节因该依赖抽象.

在 Java 中,抽象就是接口或者抽象类,两者都不能被直接实例化,细节就是实现类,因此通俗来讲,就是使用接口或者抽象类制定好规范和契约,不去设计任何具体的操作,把展现细节的任务交给实现类来完成.  总而言之,依赖倒转原则就是面向接口编程.

1.2.7、合成/聚合复用原则

合成/聚合复用原则:也叫做合成复用原则,就是在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分,  而新对象通过对这些对象的委派达到复用已有功能的目的.  尽量使用 对象组合,不要继承来达到复用的目的.

在面向对象设计中,可以通过两种方式实现复用已有设计,首先因该考虑使用 组合/聚合 可以使用系统更加灵活,降低类与类之间的耦合度.  其次才考虑继承,并且使用继承时,需要严格遵循 里氏替换原则.

好处:通过 合成/聚合关系可以将现有对象纳入到新对象中,使之成为新对象的一部分,让新对象可以调用已有对象的功能.  这样做使得成员对象内部实现不可见,达到 “黑箱” 复用.  相对于继承关系而言,进一步降低耦合度.

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

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

相关文章

chromedriver下载与安装方法

下载与安装: 1.查看Chrome浏览器版本 首先,需要检查Chrome浏览器的版本。请按照以下步骤进行: 打开Chrome浏览器。 点击浏览器右上角的菜单图标(三个垂直点)。 选择“帮助”(Help)。 在下拉菜单中选择“…

Swagger2的配置

Swagger2的配置&#xff1a; 1.要用到的依赖包&#xff1a; <!-- swagger2 依赖 --><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.7.0</version></dependency>…

网络是什么?(网络零基础入门篇)

1.如何理解局域网和广域网&#xff1f; 2.路由器和交换机是怎么样工作的&#xff1f; 3.三层交换机能不能代替路由器&#xff1f; -- 局域网 广域网 -- 企业网架构&#xff0c;运营商架构&#xff0c;数据中心架构 -- 局域网 通过 交换机连接的 转发 相同的ip地址…

TSINGSEE青犀基于AI视频智能分析的客流统计分析场景方案

随着AI技术的不断发展与人类需求的不断提升&#xff0c;视觉目标的检测识别、智能监控在人们的生活中均有着广泛的应用。其中&#xff0c;智能安防视频监控是计算机视觉的重要应用领域&#xff0c;而AI客流统计则是近年来此领域大家关注热度较高的技术之一。 行业痛点 传统的客…

javaee SpringMVC文件上传 项目结构

引入依赖 <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0…

c++模板库容器list vector map set操作和性能对比

文章目录 listvectormapset性能比较总结 list 列表&#xff08;list&#xff09;是C STL中的一种容器类型&#xff0c;它是一个双向链表&#xff0c;可以在任意位置高效地添加、删除、移动元素。 以下是一些常用的列表操作&#xff1a; 创建列表 #include <list> std…

21.6 CSS 弹性布局

1. 弹性盒子 CSS弹性盒子(Flexbox)是一种布局模型, 用于创建灵活的, 自适应的网页布局. 它的目的是在不同屏幕尺寸和设备上实现一致的布局效果.引入弹性盒布局模型的目的是提供一种更加有效的方式来对一个容器中的子元素进行排列, 对齐和分配空白空间.弹性容器通过设置display…

c++视觉图像线性混合

图像线性混合 使用 cv::addWeighted() 函数对两幅图像进行线性混合。alpha 和 beta 是两幅图像的权重&#xff0c;它们之和应该等于1。gamma 是一个可选的增益&#xff0c;这里设置为0。 你可以通过调整 alpha 的值来改变混合比例。如果 alpha0.5&#xff0c;则两幅图像等权重…

扬尘在线监测是什么?如何实现?

扬尘在线监测技术是一种针对扬尘污染问题的环境监测技术&#xff0c;它通过实时监测和数据分析&#xff0c;为管理者提供准确及时的信息&#xff0c;以便他们可以采取有效的控制措施来减少扬尘污染对空气质量和人们健康的影响。 扬尘在线监测系统通常由传感器、数据采集仪器、…

SpringBoot项目:Cannot find declaration to go to

SpringBoot项目get,set方法总报Cannot find declaration to go to 搜了很多答案&#xff0c;没解决 后来仔细一想&#xff0c;原来是我的idea软件重装了&#xff0c;lombok插件没重新安装导致。 安装步骤&#xff1a; 1、下载地址&#xff1a;https://plugins.jetbrains.com…

12P2532X152 KJ3222X1-BA1 CE4003S2B1 EMERSON DELTAV

12P2532X152 KJ3222X1-BA1 CE4003S2B1 EMERSON DELTAV 除了标准的实时计算、通信和控制&#xff0c;边缘设备和关键网络应用的fog通常执行人工智能(AI)、虚拟现实(VR)和增强现实(AR)解决方案。 目前&#xff0c;制药商和医疗保健机构对它们的需求快速增长&#xff0c;因为它们…

el-table进阶(每条数据分行或合并)

最麻烦的还是css样式&#xff0c;表格样式自己调吧 <!-- ——————————————————————————————————根据数据拓展表格—————————————————————————————————— --> <div style"display: flex"&…

SAP从入门到放弃系列之QM检验方法(Inspection Method)

概述 检验方法描述了如何对检验特征执行检验。 QS21-创建主检验特征时&#xff0c;可以对主检验特征可以分配多种检验方法。关于创建主检验特征详见&#xff1a;SAP从入门到放弃系列之QM主检验特征 当任务清单中包含主检验特征时&#xff0c;将为任务清单中的特征选择特定的…

vue3 -- 封装 Turf.js地图常用方法

Turf.js中文网 地理空间分析库,处理各种地图算法 文档地址 安装 Turf 库 npm install @turf/turf创建src/hooks/useTurf.ts 文件1:获取线中心点 效果: 代码: useTurf.ts import * as turf from @turf/turf// 获取线中心点 export class CenterPointOfLine {

Linux系列讲解 —— 【fsck】检查并修复Linux文件系统

当文件系统出现损坏时&#xff0c;例如文件无法查看&#xff0c;删除等&#xff0c;可以使用 fsck&#xff08;File System Consistency Check&#xff09;进行修复。但是需要注意fsck在修复时&#xff0c;如果检查出某个文件有问题&#xff0c;可能会向用户请求删除。所以&…

分层强化学习 综述论文阅读 Hierarchical Reinforcement Learning: A Comprehensive Survey

分层强化学习 综述论文阅读 Hierarchical Reinforcement Learning: A Comprehensive Survey 摘要一、介绍二、基础知识回顾2.1 强化学习2.2 分层强化学习2.2.1 子任务符号2.2.2 基于半马尔可夫决策过程的HRL符号 2.3 通用项定义 三、分层强化学习方法3.1 学习分层策略 (LHP)3.1…

赴日IT 35岁以上程序员能申请日本技术人文签证吗?

我们都知道&#xff0c;要想去日本工作&#xff0c;必须要办理签证&#xff0c;日本人文技术国际业务签证就是一个非常好的签证种类。那么办理此类签证需要满足哪些要求呢&#xff1f; 年龄上其实比较推荐的是25-35岁这个年龄阶段&#xff0c;因为这个年龄段通常在日语能力和工…

抖音账号矩阵系统开发源码----技术研发

一、技术自研框架开发背景&#xff1a; 抖音账号矩阵系统是一种基于数据分析和管理的全新平台&#xff0c;能够帮助用户更好地管理、扩展和营销抖音账号。 抖音账号矩阵系统开发源码 部分源码分享&#xff1a; ic function indexAction() { //面包屑 $breadc…

elasticsearch内存占用详细分析

内存占用 ES的JVM heap按使用场景分为可GC部分和常驻部分。 可GC部分内存会随着GC操作而被回收&#xff1b; 常驻部分不会被GC&#xff0c;通常使用LRU策略来进行淘汰&#xff1b; 内存占用情况如下图&#xff1a; common space 包括了indexing buffer和其他ES运行需要的clas…

添加/查看/清空购物车 -----苍穹外卖day7

1.添加购物车 产品原型 接口设计 新增类使用post 需求分析 数据库查询过程中设计了冗余字段&#xff0c;意义在于提高查询速度&#xff0c;不用和菜品表中去连接查询&#xff0c;直接查询购物车表。但是冗余字段必须相对稳定不能经常变化 代码开发 在使用DTO与实体类交接的…