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

目录

一、设计模式

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.rhkb.cn/news/151640.html

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

相关文章

Docker 日志管理 - ELK

Author:rab 目录 前言一、Docker 日志驱动二、ELK 套件部署三、Docker 容器日志采集3.1 部署 Filebeat3.2 配置 Filebeat3.3 验证采集数据3.4 Kibana 数据展示3.4.1 创建索引模式3.4.2 Kibana 查看日志 总结 前言 如何查看/管理 Docker 运行容器的日志?…

1.Linux入门基本指令

个人主页:Lei宝啊 愿所有美好如期而遇 目录 01.ls指令 02.pwd指令 03.cd指令 04.touch指令 05.mkdir指令(重要) 06.rmdir&&rm指令(重要) 07.man指令(重要) 08.cp指令(重要) 09.mv指令(重要) 10.cat指令 nano指令 echo指令 输出重定向 追加重…

当 FineReport 遇见 CnosDB

随着大数据和物联网应用的快速发展,时序数据库成为了一种关键的数据存储和分析工具。而 FineReport 作为一款流行的商业智能工具,与时序数据库 CnosDB 的集成可以为企业提供更强大的数据分析和可视化功能。本博客将介绍如何将 FineReport 与 CnosDB 集成…

架构师-软件工程习题选择题

架构师-软件工程习题选择题

SpringBoot-黑马程序员-学习笔记(一)

8.pom文件中的parent 我们使用普通maven项目导入依赖时,通常需要在导入依赖的时候指定版本号,而springboot项目不需要指定版本号,会根据当前springboot的版本来下载对应的最稳定的依赖版本。 点开pom文件会看到这个: 继承了一个…

【Redis】基础数据结构-简单动态字符串SDS

C语言字符串 char *str "redis"; // 可以不显式的添加\0,由编译器添加 char *str "redis\0"; // 也可以添加\0代表字符串结束C语言中使用char*字符数组表示字符串,‘\0’来标记一个字符串的结束,不过在使用的过程中我…

自动驾驶传感器技术

自动驾驶传感器技术是自动驾驶系统的关键组成部分,它使车辆能够感知并理解周围环境。本文将深入探讨自动驾驶传感器技术,包括常见类型、工作原理以及它们在自动驾驶中的作用。 1. 摄像头 摄像头的工作原理 摄像头是基于光学原理的传感器,其…

【数组】二分查找(减不减一,看初始化!)

一、力扣习题链接 704. 二分查找 - 力扣(LeetCode) 二、思路 这道题目的前提是数组为有序数组,同时题目还强调数组中无重复元素,因为一旦有重复元素,使用二分查找法返回的元素下标可能不是唯一的,这些都是…

防火墙-——iptables

目录 安全技术:(市场上常见的防御) 1.入侵检测机制 2.入侵防御 3.防火墙 4.防水墙 通信的五大要素和四要素 iptables 四个表 数据流程图 安装iptables iptables管理选项: 匹配条件 通用匹配规则 1.查看filter中的 INPUT表 2.清…

Docker中MySql容器的数据挂载

1.查看是否有数据卷 docker inspect mysql 说明:Name的值是随机生成的不是命令的。因此没有数据卷。 2. 目录挂载 说明:本地目录不允许简写;在执行docker runi命令时,使用-v本地目录:容器内目录可以完成本地目录挂载…

滴滴发布十一大数据:延边出行需求上涨280% 西部省份成旅游热点

今年十一假期适逢中秋佳节,在亲友团聚和长假出游的多重期盼下,超级黄金周展现强劲内需,带动多样化的消费趋势,出行热情也随之高涨。滴滴出行数据显示,打车需求相比去年同期上涨80%,高峰时段每分钟呼叫突破1…

2019架构真题2020案例(四十七)

数据存储在中央仓库,处理流程独立,交互性好数据和处理耦合在一起,每次修改需要重启劣势:需要通过连接组件进行连接,性能降低优势:支持并发通过仓库连接组件访问,效率高 (8分)缓存中存储当前的热…

深度学习-卷积神经网络-ResNET

文章目录 前言1.resnet2.作者3.精度(TOP-5)4.论文一览5.竞赛排名6.网络退化7.残差8.残差 1.作者 前言 本文来自B站: ResNet深度残差网络 1.resnet 2.作者 3.精度(TOP-5) 4.论文一览 5.竞赛排名 6.网络退化 ResNet解…

12P4375X042-233C KJ2005X1-BA1 CE3007 EMERSON servo controller

12P4375X042-233C KJ2005X1-BA1 CE3007 EMERSON servo controller 我们提供三种不同类别的EDGEBoost I/O模块供选择,以实现最大程度的I/O定制: 数字和模拟输入/输出网络和连接边缘人工智能和存储 利用EDGEBoost I/O实现变革性技术 EBIO-2M2BK EBIO-2M2BK载板支持…

Android ncnn-android-yolov8-seg源码解析 : 实现人像分割

1. 前言 上篇文章,我们已经将人像分割的ncnn-android-yolov8-seg项目运行起来了,后续文章我们会抽取出Demo中的核心代码,在自己的项目中,来接入人体识别和人像分割功能。 先来看下效果,整个图像的是相机的原图&#…

Linux CentOS7 vim多窗口编辑

我们在用vim编辑文件时,有各种需求。如有时需要在多个文件之间来回操作,一会关闭一个文件,一会再打开另外一个文件,这样来回操作显得太笨拙。有时,vim编辑多行的大文件,来回查看、编辑前面一部分及最后一部…

NFT合约分析:ERC721A

概述 读者可前往我的博客获得更好的阅读体验。 本文主要介绍标准NFT实现的一个变体,即ERC721A合约实现的相关细节。ERC721A是由著名NFT系列Azuki提出,该系列NFT是著名的蓝筹NFT。本文主要聚焦于Azuki提出的ERC721A合约的代码细节分析。 与传统的ERC72…

C++ 字符串

在本文中,您将学习如何在C中处理字符串。您将学习声明它们,对其进行初始化以及将它们用于各种输入/输出操作。 字符串是字符的集合。C 编程语言中通常使用两种类型的字符串: 作为字符串类对象的字符串(标准C 库字符串类&#xff0…

HiveServer2 Service Crashes(hiveServer2 服务崩溃)

Troubleshooting Hive | 5.9.x | Cloudera Documentation 原因:别人用的都好好的,我的集群为什么会崩溃? 1.hive分区表太多(这里没有说具体数量。) 2.并发连接太多,我记的以前默认是200个连接 3.复杂的hive查询访问表的的分区…

【好玩】如何在github主页放一条贪吃蛇

前言 🍊缘由 github放小蛇,就问你烧不烧 起因看到大佬github上有一条贪吃蛇扭来扭去,觉得好玩,遂给大家分享一下本狗的玩蛇历程 🥝成果初展 贪吃蛇 🎯主要目标 实现3大重点 1. github设置主页 2. git…