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

设计模式-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://xiahunao.cn/news/2980712.html

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

相关文章

【UE5.1 C++】VS2022下载安装

目录 步骤 一、Visual Studio下载安装 二、Visual Studio Integration Tool插件安装 先看一下UE和VS的兼容性 (虚幻5:为虚幻引擎C项目设置Visual Studio开发环境) (虚幻4:设置虚幻引擎的Visual Studio&#xff0…

Cloudera最新认证体系-2024Hadoop认证

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

Golang基础3-函数、nil相关

函数 需要声明原型支持不定参数 func sum(numbers ...int)int支持返回多值支持递归支持命名返回参数 // 命名返回参数 func add(a, b int) (sum int) {sum a breturn // 这里不需要显式地写出返回值,因为已经在函数签名中声明了命名返回参数 } 支持匿名函数、闭包…

【刷题】前缀和入门

送给大家一句话: 既然已经做出了选择,最好还是先假定自己是对的。焦虑未来和后悔过去,只经历一个就够了。 – 张寒寺 《不正常人类症候群》 ☆ミヾ(∇≦((ヾ(≧∇≦)〃))≧∇)ノ彡☆ ☆ミヾ(∇≦((ヾ(≧∇≦)〃))≧∇)ノ彡☆ ☆ミヾ(∇≦((ヾ…

信息系统项目管理师0064:软件实现(5信息系统工程—5.1软件工程—5.1.4软件实现)

点击查看专栏目录 文章目录 5.1.4软件实现1.软件配置管理2.软件编码3.软件测试记忆要点总结5.1.4软件实现 1.软件配置管理 软件配置管理通过标识产品的组成元素、管理和控制变更、验证、记录和报告配置信息,来控制产品的演进和完整性。软件配置管理与软件质量保证活动密切相关…

关于Domain的查询命令

dig: 用来执行DNS查询,可以获取指定域名的所有类型的DNS记录。对网络管理员和开发人员尤其有用。 host: 一个简化版的DNS查询工具,适合快速查询域名的IP地址或某种类型的DNS记录。 nslookup: 另一个DNS查询工具,既支持交互模式也支持命令行模…

简单谈谈URL过滤在网络安全中的作用

用户花在网络上的时间越来越多,浏览他们最喜欢的网站,点击电子邮件链接,或利用各种基于网络的 SaaS 应用程序供个人和企业使用。虽然这种不受约束的网络活动对提高企业生产力非常有用,但也会使组织面临一系列安全和业务风险&#…

线性代数 --- 矩阵的对角化以及矩阵的n次幂

矩阵的对角化以及矩阵的n次幂 (特征向量与特征值的应用) 前言: 在上一篇文章中,我记录了学习矩阵的特征向量和特征值的学习笔记,所关注的是那些矩阵A作用于向量x后,方向不发生改变的x(仅有尺度的缩放)。线…

面试ssss

响应式布局 响应式布局是一种设计和开发网页的方法,使网页能够适应不同的设备和屏幕尺寸,提供更好的用户体验。它通过使用媒体查询(Media Queries)和弹性布局(Flexbox)等技术,根据设备的特性和…

SSH Key生成

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…

代码随想录算法训练营DAY32|C++贪心算法Part.2|122.买卖股票的最佳时机II、55.跳跃游戏、45.跳跃游戏II

文章目录 122.买卖股票的最佳时机II思路CPP代码 55.跳跃游戏思路CPP代码 45.跳跃游戏II思路方法一代码改善 CPP代码 122.买卖股票的最佳时机II 力扣题目链接 文章讲解:122.买卖股票的最佳时机II 视频讲解: 状态:本题可以用动态规划&#xff0…

构建NodeJS库--前端项目的打包发布

1. 前言 学习如何打包发布前端项目,需要学习以下相关知识: package.json 如何初始化配置,以及学习npm配置项; 模块类型type配置, 这是nodejs的package.json的配置main 入口文件的配置 webpack 是一个用于现代 JavaSc…

Linux加强篇-存储结构与管理硬盘(一)

目录 ⛳️推荐 从“/”开始 物理设备命名规则 文件系统与数据资料 ⛳️推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站 从“/”开始 Linux系统中一切都是文件,都是从“…

深度解析:云计算的三宝——IaaS、PaaS和SaaS

4月22日,腾讯宣布旗下协作SaaS产品全面接入腾讯混元大模型,除去企业微信、腾讯会议、腾讯文档等“一门三杰”产品,腾讯乐享、腾讯电子签、腾讯问卷、腾讯云AI代码助手等协作SaaS产品也都已实现智能化升级。大模型应用落地再加速。 那么什么是…

HarmonyOS开发案例:【相机开发】

基本概念 相机是OpenHarmony多媒体进程提供的服务之一,提供了相机的录像、预览、拍照功能,支持多用户并发取流。 在进行应用的开发前,开发者应了解以下基本概念: 视频帧 视频流指的是将一系列图片数据按照固定时间间隔排列形成的…

牛客社区所有的表和SQL语句

文章目录 1 帖子表 discuss_post1.1 字段描述1.2 相关功能描述1.2.1 分页查询帖子1.2.2 查询帖子总数量1.2.3 插入一条帖子记录1.2.4 根据帖子ID查询某条帖子1.2.5 更新帖子评论数量1.2.6 更新帖子类型1.2.6 更新帖子状态1.2.7 更新帖子分数 2 用户表 user2.1 字段描述2.2 相关…

【七】jmeter5.5+influxdb2.0+prometheus+grafana

参考文章:https://blog.csdn.net/wenxingchen/article/details/126892890 https://blog.csdn.net/Zuo19960127/article/details/119726652 https://blog.csdn.net/shnu_cdk/article/details/132182858 promethus参考 由于自己下载的是infuldb2.0,所以按照…

云Docker部署Guacamole经frp中转远程连接Windows

安装frps sudo nohup ./frps -c frps.ini >/dev/null 2>&1 & frps.ini [common] bind_port 7000# Virtual host configuration vhost_http_port 80 vhost_https_port 443# Dashboard configuration dashboard_addr 0.0.0.0 dashboard_port 7500 dashboar…

自然语言处理 (NLP) 的技术演变史

一、简述 本文的目标是了解自然语言处理 (NLP) 的历史,包括 Transformer 体系结构如何彻底改变该领域并帮助我们创建大型语言模型 (LLM)。 基础模型(如 GPT-4)是最先进的自然语言处理模型,旨在理解、生成人类语言并与之交互。 要理…

FebHost:科技企业如何规划并注册.AI域名?

为确保企业使用.AI域名的方式准确反映其对人工智能技术的关注,企业应考虑以下步骤: 了解法律和合规要求: 第一步是了解与 .AI 域名相关的独特法律和合规要求。由于.AI域名源于安圭拉,企业必须遵守安圭拉的限制和法律规定。这包括…