设计模式-00 设计模式简介之几大原则

news2024/10/7 16:27:08
设计模式-00 设计模式简介之几大原则


本专栏主要分析自己学习设计模式相关的浅解,并运用modern cpp 来是实现,描述相关设计模式。
通过编写代码,深入理解设计模式精髓,并且很好的帮助自己掌握设计模式,顺便巩固自己的cpp
语言功底。

(一)专栏学习前置知识

  1. c++语言, c++11 特性
  2. 面向对象 oop,尤其是c++ 相关
(二)几大设置原则

回顾设计模式几大原则:

(1)Single responsibility Principle 单一职责原则 SRP

单一职责原则是面向对象设计中的一个原则,它规定一个类或模块应该只负责一项职责。换句话说,一个类或模块应该只做一件事,并且做得很好。

SRP 的优点,遵守 SRP 有许多优点,包括:

  • 可维护性提高: 职责单一的类或模块更容易维护,因为它们只关注一件事。
  • 可读性提高: 职责单一的类或模块更容易理解,因为它们只包含与单一职责相关的信息。
  • 可测试性提高: 职责单一的类或模块更容易测试,因为它们只包含一个关注点。
  • 重用性提高: 职责单一的类或模块可以更容易地重用于其他应用程序或系统中。

(2)Open Close Principle 开闭原则 OCP 

开闭原则是面向对象设计中的一个原则,它规定软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。换句话说,您应该能够在不修改现有代码的情况下扩展软件的功能。

OCP 的优点,遵守 OCP 有许多优点,包括:

  • 可维护性提高: 遵循 OCP 的软件更容易维护,因为您可以在不修改现有代码的情况下添加新功能。
  • 可扩展性提高: 遵循 OCP 的软件更容易扩展,因为您可以轻松地添加新功能,而无需担心破坏现有功能。
  • 灵活性提高: 遵循 OCP 的软件更灵活,因为它可以轻松地适应新的需求和要求。

(3)Liskov Substitution Principle 里氏代换原则


里氏代换原则面向对象设计中的一个原则,它规定子类型必须能够替换其基类型而不会破坏程序的正确性。
换句话说,任何使用基类型的地方都应该可以透明地使用其子类型而不改变程序的行为。

LSP 的优点,遵守 LSP 有许多优点,包括:

  • 可维护性提高: 遵循 LSP 的代码更容易维护,因为您可以替换子类型而无需担心破坏现有代码。
  • 可扩展性提高: 遵循 LSP 的代码更容易扩展,因为您可以轻松地添加新的子类型,而无需担心破坏现有代码。
  • 灵活性提高: 遵循 LSP 的代码更灵活,因为它可以轻松地适应新的需求和要求。


遵循 LSP 通常涉及确保子类型与基类型的行为兼容。例如,如果基类型有一个方法,则子类型也必须有一个具有相同名称
和参数类型的方法,并且该方法的行为不能比基类型的方法更宽松。

遵循 LSP 并不总是容易的,然而,努力遵循这一原则可以大大提高代码的可维护性、可扩展性和灵活性。
 

(4) Interface Segregation Principle 接口隔离原则 

接口隔离原则(Interface Segregation Principle,ISP)

接口隔离原则是面向对象设计中的一个原则,它规定客户端不应该被迫依赖它们不使用的接口。换句话说,接口应该被细分为更小的、更具体的接口,以便客户端只依赖它们实际需要的接口。

ISP 的优点,遵守 ISP 有许多优点,包括:

  • 可维护性提高: 遵循 ISP 的代码更容易维护,因为您可以轻松地修改或删除接口而不会影响其他客户端。
  • 可扩展性提高: 遵循 ISP 的代码更容易扩展,因为您可以轻松地添加新的接口而无需影响现有客户端。
  • 灵活性提高: 遵循 ISP 的代码更灵活,因为它可以轻松地适应新的需求和要求。
  • 如何遵循 ISP

遵循 ISP 通常涉及将大型接口分解成更小的、更具体的接口。例如,您可以创建一个接口来定义一组基本操作,然后创建其他接口来扩展基本操作并提供特定功能。

遵循 ISP 并不总是容易的,特别是在处理复杂系统时。然而,努力遵循这一原则可以大大提高代码的可维护性、可扩展性和灵活性。

(5)Dependence Inversion Principle 依赖倒转原则


依赖倒转原则是面向对象设计中的一个原则,它规定高层模块不应该依赖底层模块。相反,两者都应该依赖于抽象。抽象不应该依赖细节,细节应该依赖抽象。

DIP 的优点

遵守 DIP 有许多优点,包括:

  • 可测试性提高: 遵循 DIP 的代码更容易测试,因为您可以轻松地模拟抽象而不必担心底层实现。
  • 可维护性提高: 遵循 DIP 的代码更容易维护,因为您可以轻松地修改或替换底层实现而不影响高层模块。
  • 可扩展性提高: 遵循 DIP 的代码更容易扩展,因为您可以轻松地添加新的高层模块而无需担心底层实现。

遵循 DIP 通常涉及使用抽象类或接口来定义模块之间的依赖关系。然后,您可以将具体类实现为抽象类或接口,而无需担心高层模块的实现。

遵循 DIP 并不总是容易的,特别是在处理复杂系统时。然而,努力遵循这一原则可以大大提高代码的可测试性、可维护性和可扩展性。

(三)总结

今天先先总结这几个大的设置原则,后续相关具体的设计模式,都会体系这些设计原则。


 

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

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

相关文章

【神经网络基础辨析】什么是神经网络的主干(backbone)、颈部(neck)和头部(head)网络

在神经网络中,通常将网络分为三个部分:骨干网络(Backbone)、颈部网络(Neck)、和头部网络(Head)。 骨干网络(Backbone) 骨干网络通常是神经网络的主要部分&a…

探索设计模式的魅力:主从模式与AI大模型的结合-开启机器学习新纪元

​🌈 个人主页:danci_ 🔥 系列专栏:《设计模式》 💪🏻 制定明确可量化的目标,坚持默默的做事。 ✨欢迎加入探索主从模式与AI大模型之旅✨ 🌟Hey, tech enthusiasts! 你是否还在追…

【嵌入式AI部署神经网络】STM32CubeIDE上部署神经网络之指纹识别(Pytorch)——篇一|环境搭建与模型初步部署篇

前言:本篇主要讲解搭建所需环境,以及基于pytorch框架在stm32cubeide上部署神经网络,部署神经网络到STM32单片机,本篇实现初步部署模型,没有加入训练集与验证集,将在第二篇加入。篇二详细讲解STM32CubeIDE上…

PHP之内置web服务器

1. 前言 PHP从5.4开始,就提供了一个内置的web服务器。 这个主要是用来做本地的开发测试用的,不能用于线上环境。 将PHP的安装路径配置到电脑的系统环境变量Path中,下图是win7,win10中会看的更清楚 2. 进入项目目录,执…

OpenHarmony南向开发案例:【 智能家居中控】

应用场景简介 智能家居。 今天打造的这一款全新智能家庭控制系统,凸显应用在智能控制和用户体验的特点,开创国内智能家居系统体验新局面。新的系统主要应用在鸿蒙生态。 工程版本 系统版本/API版本:OpenHarmony SDK API 8IDE版本&#xf…

unity cinemachine相机 (案例 跟随角色移动)

安装相机包 打开包管理工具 在 unity registry 搜索cinemachine 会在maincamera中生成一个组件cinemachineBrain 只能通过虚拟相机操控 主相机 虚拟相机的参数 案例 1.固定相机效果 位置 在固定的地方 默认的模式 2.相机跟随人物效果 焦距设置 20 跟随设置 把playere…

【LeetCode热题100】【多维动态规划】不同路径

题目链接:62. 不同路径 - 力扣(LeetCode) 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记…

Django模型继承之Meta继承

在Django模型继承中,当一个抽象基类被设计完成后,它会将该基类中定义的Meta内部类以属性的形式提供给子类。另外,如果子类未定义自己的Meta类,那么它就会默认继承抽象基类的Meta类。 关于Meta类的继承,大致总结如下&a…

Ubuntu20.04安装redis5.0.7

redis下载命令: wget https://download.redis.io/releases/redis-5.0.7.tar.gz 解压到 opt目录下 tar -zxvf redis-5.0.7.tar.gz -C /opt apt install -y gcc # 安装gccapt install make # 安装make 后面执行make一直报错 make报错后清除: make …

机器学习(XgBoost)预测顶和底

之前的文章中,我们对中证1000指数进行了顶和底的标注。这一篇我们将利用这份标注数据,实现机器学习预测顶和底,并探讨一些机器学习的原理。 我们选取的特征非常简单–上影线和WR(William’s R)的一个变种。选取这两个…

环境配置——Windows平台配置VScode运行环境为远程服务器或虚拟机

1. 远程机需要先安装SSH服务,命令如下 sudo apt install openssh-server 2. 安装好后需要开启SSH服务: sudo service sshd start 3. 查看SSH服务是否有被开启: sudo systemctl status sshd.service 4. 本地Windows需要生成密钥将公钥放…

毕业撒花 流感服务小程序的设计与实现

目录 1.1 总体页面设计 1.1.1 用户首页 1.1.2 新闻页面 1.1.3 我的页面 1.1.5 管理员登陆页面 1.1.6 管理员首页 1.2 用户模块 1.2.1 体检预约功能 1.2.2 体检报告功能 1.2.4 流感数据可视化功能 1.2.5 知识科普功能 1.2.6 疾病判断功能 1.2.7 出示个人就诊码功能 …

(五)AB测试及两个案例 学习简要笔记 #统计学 #CDA学习打卡

目录 一. AB测试简介 1)假设检验的一般步骤 2)基于假设检验的AB测试步骤 二. 案例1:使用基于均值的假设检验进行AB测试 1)原始数据 2)提出原假设H0和备择假设H1 3)使用均值之差的t检验,计…

计算机网络3——数据链路层3以太网的MAC层

文章目录 一、MAC 层的硬件地址1、介绍2、注意点3、定制标准 二、MAC 帧的格式1、结构2、工作原理3、其他 一、MAC 层的硬件地址 1、介绍 在局域网中,硬件地址又称为物理地址或 MAC地址(因为这种地址用在MAC帧中)。 大家知道,在所有计算机系统的设计中…

MySQL从入门到高级 --- 2.DDL基本操作

文章目录 第二章:2.基本操作 - DDL2.1 数据库的常用操作创建数据库选择要操作的数据库删除数据库修改数据库编码 2.2 表结构的常用操作创建表格式查看当前数据库的所有表名称查看指定某个表的创建语句查看表结构删除表 2.3 修改表结构添加列修改列名和类型删除列修改…

在Spring boot中指定随机可用的端口

​ 正常情况下每个spring boot启动都有固定的端口,也就是8080,如果启动多个项目,很容易出现端口冲突,那么怎么解决这个问题呢? 解决方案1: random 随机端口 ​ 在spring boot中,可以通过${ran…

20240424 每日一题:2385. 感染二叉树需要的总时间

题目简介: 这个问题描述了一个情景:给定一棵二叉树和一个起始节点值,起始节点被感染后,感染将从该节点开始向其相邻节点传播。每分钟,如果一个节点此前还没有感染,并且它与一个已感染节点相邻,…

vue项目打包时因为图片问题报错

执行 npm run build命令打包项目时报错,看起来是图片的问题: package.json里面image-webpack-loader的版本是^7.0.1 解决方案: 1、先卸载 npm uninstall image-webpack-loader 2、用cnpm重新安装 cnpm install image-webpack-loader --save…

《ElementPlus 与 ElementUI 差异集合》el-select 差异点,如:高、宽、body插入等

宽度 Element UI 父元素不限制宽度时,默认有个宽度 207px; 父元素有固定宽度时,以父元素宽度为准; Element Plus 父元素不限制宽度时,默认100%; 父元素有固定宽度时,以父元素宽度为准&#x…

百度网盘SVIP超级会员试用1天领取活动地址2024最新

百度网盘SVIP超级会员是百度网盘提供的一种高级会员服务,用户开通后可以享受多项特权和服务。以下是对百度网盘SVIP超级会员的详细介绍: 一、会员特权 百度网盘SVIP超级会员享有众多特权,包括但不限于: 容量套餐:SV…