【设计模式】软件开发原则

news2024/11/24 18:54:53

开闭原则(OCP)

        定义:一个软件实体应当对扩展开放,对修改关闭。也就是说在设计一个模块的时候,应当使这个模块可以在不被修改的前提下被扩展,即使现在不修改源代码的情况下改变这个模块的行为。

        意思:写好一个代码。后面需要添加功能的时候,不是在一个已经写好的代码中修改,而是重新写一个方法来添加而不必修改原来的功能。

总结:面对需求,对程序的改动是通过增加新代码进行的,而不是改变原来的代码

依赖倒转原则(DIP)

定义:

  1. 高层模块不应该依赖低层模块,它们都应该依赖抽象。抽象不应该依赖于细节,细节应该依赖于抽象。

  2. 要针对接口编程,不要针对实现编程。

 

  • 简单来说,依赖倒转原则:代码要依赖于抽象的类,而不要依赖与具体的类;要针对接口或抽象类编程,而不是针对具体类编程

  • 实现开闭原则的关键是抽象化,并且从抽象化导出具体化实现,如果说开闭原则是面向对象设计的目标的化,那么依赖倒转原则就是面向对象设计的主要手段

  • 依赖倒转原则的常见实现方式之一是在代码中使用抽象类,而将具体类放在配置文件中。

里氏替换原则(LSP)

        定义:在软件中将一个基类对象替换成它的子类对象,程序将不会产生任何错误和异常,反过来则不成立,如果一个软件实体使用的是一个子类对象的话,那么它不一定能够使用基类对象。

        例如:我喜欢动物,那我一定喜欢狗,因为狗是动物的子类;但是我喜欢狗,不能据此断定我喜欢动物,因为我并不喜欢老鼠,虽然它也是动物。

 

 

        里氏代换原则是实现开闭原则的重要方式之一,由于使用基类对象的地方都可以使用子类对象,因此在程序中尽量使用基类类型来对对象进行定义,而在运行时再确定其子类类型,用子类对象来替换父类对象。

单一职责原则(SRP)

        定义:一个类只负责一个功能领域中的相应职责,或者可以定义为:就一个类而言,应该只有一个引起它变化的

        一个类(大到模块,小到方法)承担的职责越多,它被复用的可能性就越小,而且一个类承担的职责过多,就相当于将这些职责耦合在一起,当其中一个职责变化时,可能会影响其他职责的运作。

        因此要将这些职责进行分离,将不同的职责封装在不同的类中,即将不同的变化原因封装在不同的类中,如果多个职责总是同时发生改变则可将它们封装在同一类中。

 

迪米特法则(LKP)

定义:一个软件实体应当尽可能少地与其他实体发生相互作用。

        如果一个系统符合迪米特法则,那么当其中某一个模块发生修改时,就会尽量少地影响其他模块,扩展会相对容易,这是对软件实体之间通信的限制,迪米特法则要求限制软件实体之间通信的宽度和深度。迪米特法则可降低系统的耦合度,使类与类之间保持松散的耦合关系。

        迪米特法则要求我们在设计系统时,应该尽量减少对象之间的交互,如果两个对象之间不必彼此直接通信,那么这两个对象就不应当发生任何直接的相互作用,如果其中的一个对象需要调用另一个对象的某一个方法的话,可以通过第三者转发这个调用。简言之,就是通过引入一个合理的第三者来降低现有对象之间的耦合度。

 

合成复用原则(CRP)

尽量使用对象组合,而不是继承来达到复用的目的。

接口隔离原则(ISP)

定义:

  1. 客户端不应该依赖那些它不需要的接口。

  2. 一旦一个接口太大,则需要将它分割成一些更细小的接口,使用该接口的客户端仅需知道与之相关的方法即可。

分析:

  1. 接口隔离原则是指使用多个专门的接口,而不使用单一的总接口。每一个接口应该承担一种相对独立的角色,不多不少,不干不该干的事,该干的事都要干。

  2. 使用接口隔离原则拆分接口时,首先必须满足单一职责原则,将一组相关的操作定义在一个接口中,且在满足高内聚的前提下,接口中的方法越少越好。

  3. 可以在进行系统设计时采用定制服务的方式,即为不同的客户端提供宽窄不同的接口,只提供用户需要的行为,而隐藏用户不需要的行为。

 

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

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

相关文章

(包含源代码)2022年全国大学生数学建模竞赛E题目-小批量物料生产安排详解+思路+Python代码时序预测模型-补完

目录 前言 赛题分析 1.问题一 问题分析 物料频率 代码详细操作: 出现频次 需求总数 趋势标量 方法 平均每天需求额度 整合代码 熵权法 详细介绍: 二、使用步骤 2.计算指标信息熵 3.熵权法相关代码 得到权重: 只希望各位以…

决策树-sklearn

决策树 1.概述 1.1 决策树是如何工作 决策树能够从一系列有特征和标签的数据中总结出决策规则,并且使用树状图的结构来表现,从而达到解决回归和分类问题。通俗的说,就是我们只需要问一系列问题就可以对数据进行分类。 核心要解决的问题&am…

20221226编译Toybrick的TB-RK3588X开发板的Android12系统3

20221226编译Toybrick的TB-RK3588X开发板的Android12系统3 2022/12/26 18:27 编译指令: 1、cat android12-rk3588.tar.gz.* >android12-rk3588.tar.gz 2、tar -zxvf android12-rk3588.tar.gz,解压缩后生成android12-rk3588-new目录 3、android12-rk3588-new 4、…

CSS篇.day04-单位,流式布局,弹性布局(flex),网格布局,渐变,变形与过渡

目录 1. 单位 2.流式布局 3.弹性布局(flex) 4.网格布局 5.渐变 6.变形与过渡 1. 单位 px: 绝对单位 像素em: 相对单位 基准点为父节点字体大小 若自身定义了font-size按自身来计算(一般浏览器默认16px)rem: 相对单位 相对根节点html的字体大小, css3新增属性, 根元…

【Python百日进阶-数据分析】Day139 - plotly甘特图:plotly.figure_factory.create_gantt()

文章目录一、语法二、参数三、返回值四、实例4.1 普通ff甘特图4.2 将任务组合在一起4.3 按数值变量着色4.4 create_gantt4.5具有数字条目的按列索引4.6 具有字符串条目的按列索引4.7 使用颜色字典4.8一、语法 已弃用,请用plotly.express.timeline()代替。 plotly.…

LeetCode88. 合并两个有序数组

题目 给你两个按非递减顺序排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。请你合并 nums2 到 nums1 中,使合并后的数组同样按非递减顺序排列。 注意:最终,合并后数组不…

统一观测|如何使用 Prometheus 监控 Windows

作者: 颍川 引言 微软 Windows 是当前主流操作系统之一,在桌面和服务端均有较大市场份额。 对于 Linux 操作系统,Prometheus 可以通过 Node Exporter 来进行基础资源(CPU、内存、磁盘、网络等)监控,类似…

吴恩达的2022年终盘点:生成式AI、ViT、大模型

昨日,**吴恩达在圣诞节的《The Batch》特刊上发布了一年一度的年终盘点。**在过去的一年,生成式AI迎来爆发式增长,由人工智能生成的图片在社交平台疯狂传播,引发大量争议的同时也推动了投资;视觉 Transformer(ViT) 的工…

【nowcoder】笔试强训Day8

目录 一、选择题 二、编程题 2.1两种排序方法 2.2最小公倍数 一、选择题 1.下列选项中关于Java中super关键字的说法正确的是() A super关键字是在子类对象内部指代其父类对象的引用 B super关键字不仅可以指代子类的直接父类,还可以直…

SpreadJS 16新建文件格式,Data Manager中的层次结构

SpreadJS 16新建文件格式,Data Manager中的层次结构 为TableSheet、Designer、Calculation、Shape和Workbook添加增强功能。 2022年12月22日-16:53新版本 特征 新建文件格式 新的.sjs文件格式使ExcelIO进程更快、更小。 表页增强功能 Data Manager中的层次结构。 Data Manager字…

【代码随想录】链表-golang

链表 from 代码随想录 移除链表元素 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val val 的节点,并返回 新的头节点 。 思路:设置一个新的节点,节点的下一个是链表的第一个节点 /*** Definition f…

阿根廷夺冠早已预判,梅西经济爆火,这款产品在跨境电商卖断货了

2022年12月18日23:00,世界杯的决赛将举行,阿根廷会战法国;期间,梅西和姆巴佩也将会在绿茵场上狭路相逢。而作为现役名声最为响亮的球星之一,此次卡塔尔也是梅西最后一次征战世界杯赛场,同时,随着…

基于Python实现电影推荐系统【100010052】

电影推荐系统 标签:Tensorflow、矩阵分解、Surprise、PySpark 1、用Tensorflow实现矩阵分解 1.1、定义one_batch模块 import numpy as np import pandas as pddef read_and_process(filename, sep ::):col_names [user, item, rate, timestamp]df pd.read_cs…

IP判断.库函数复习.数组.C

strtok(在string.h库里)函数以"."为分隔符对IP字符串进行切分. atoi函数(在stdlib.h里)将切分的一部分字符串转换为十进制数字. 描述 C 库函数 char *strtok(char *str, const char *delim) 分解字符串 str 为一组字符串&#xf…

LeetCode题目笔记——1759. 统计同构子字符串的数目

文章目录题目描述题目难度——中等方法一:数学代码/C代码/Python总结题目描述 给你一个字符串 s ,返回 s 中 同构子字符串 的数目。由于答案可能很大,只需返回对 109 7 取余 后的结果。 同构字符串 的定义为:如果一个字符串中的…

300道网络安全工程师面试题(附答案解析)冲刺金三银四

2022年马上就要过去了,先来灵魂三连问,年初定的目标完成多少了?薪资涨了吗?女朋友找到了吗? 好了,不扎大家的心了,接下来进入正文。 由于我之前写了不少网络安全技术相关的文章和回答&#xff…

nginx 报400_nginx 400 Bad request

记录一次自己写出来的bug. 首先自己在gateway中做了filter,操作了header 操作中返回的报错400 nginx, 所以一直将矛头指向了nginx配置,但是各种查询和修改后,错误依旧. 静下心来一步步的看,发现请求实际上已经通过nginx发送到了gateway中,并且gateway日志中也清楚的记录了lo…

[普及练习场]失踪的7

本专辑上篇: [普及练习场] 生活大爆炸版石头剪刀布 看得都爽,对吧!感谢hydro的页面和浴谷的搬运。 目录 一.读题 失踪的7 题意 二 .做题 算法原理 算法实现 全篇代码分解讲解 输入 中心 一.读题 失踪的7 题目描述 远古的 Pascal 人也…

FIT2CLOUD飞致云荣膺“2022年度OSCHINA优秀开源技术团队”奖项

2022年12月,知名开源技术社区OSCHINA(开源中国)公布了“2022年度OSCHINA优秀开源技术团队”入选名单。凭借在开源软件研发和开源社区运营方面的优秀表现,FIT2CLOUD飞致云获得了OSCHINA社区的认可,荣膺“2022年度优秀开…

基于人脸关键点检测的驾驶员睡意检测系统

摘要 驾驶员注意力不集中或者分心是道路交通事故的主要原因。 为了减少道路交通事故,设计开发驾驶员疲劳检测系统至关重要。 本研究利用人脸关键点检测方法提出了驾驶员睡意检测系统,目的是使驾驶更安全。 一.人类检测方法 人脸关键点检测是人脸识别任…