设计模式-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://www.mzph.cn/diannao/2503.shtml

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

相关文章

用于车载T-BOX汽车级的RA8900CE

用于车载T-BOX等高精度计时的汽车级时钟模块RTC:RA8900CE.车载实时时钟芯片RA8900CE内置32.768Khz的晶体,实现年、月、日、星期、小时、分钟和秒精准计时。RA8900CE满足AEC-Q200认证,内置温补功能,保证实时时钟的稳定可靠,功耗低至…

【Linux】解决ubuntu20.04版本插入无线网卡没有wifi显示【无线网卡Realtek 8811cu】

ubuntu为Realtek 8811cu安装驱动,解决wifi连接问题 1、确认无线网卡的型号-Realtek 8810cu2、下载并配置驱动 一句话总结:先确定网卡的型号,然后根据网卡的型号区寻找对应的驱动下载,下载完成之后在ubuntu系统中进行编译&#xff…

LeetCode 123.买卖股票的最佳时机III 188.买卖股票的最佳时机IV

LeetCode 123.买卖股票的最佳时机III 题目链接&#xff1a; LeetCode 123.买卖股票的最佳时机III 代码&#xff1a; class Solution { public:int maxProfit(vector<int>& prices) {int size prices.size();if(size0) return 0;//dp[i][0] 不操作//dp[i][1]…

js如何模拟表单输入

jQuery时代&#xff0c;模拟表单输入很简单&#xff0c;本质上就是操作dom&#xff0c;选择对于的dom&#xff0c;给dom.value设置值即可。 到了react时代就不同了&#xff0c;虽然也可以通过js拿到dom&#xff0c;给dom.value设置&#xff0c;但是react的状态绑定下&#xff…

Java 执行 JVM Native 方法导致内存碎片

背景&#x1f69e; 由于需要调用到 C/C 的业务对外&#xff0c;使用了 Java 来封装 SDK 进行调用。 事故起因⚡&#xff1a;当 Java 使用 JNI 发生调用 JVM Native 本地方法时&#xff0c;发现内存一直飙升发生 OOM。 操作复现&#x1f50d; 使用 Jmeter 进行压测高并发环境…

C++笔记打卡第21天(map)

1.map基本概念 map中所有元素都是pairpair中第一个元素为key&#xff0c;起到索引作用&#xff0c;第二个元素为value所有元素都会根据元素的键值自动排序 本质&#xff1a; map/multimap属于关联式容器&#xff0c;底层结构是用二叉树实现 优点&#xff1a; 可以根据key值…

HTTP慢连接攻击的原理和防范措施

随着互联网的快速发展&#xff0c;网络安全问题日益凸显&#xff0c;网络攻击事件频繁发生。其中&#xff0c;HTTP慢速攻击作为一种隐蔽且高效的攻击方式&#xff0c;近年来逐渐出现的越来越多。 为了防范这些网络攻击&#xff0c;我们需要先了解这些攻击情况&#xff0c;这样…

【笔试】03

FLOPS FLOPS 是 Floating Point Operations Per Second 的缩写&#xff0c;意为每秒浮点运算次数。它是衡量计算机性能的指标&#xff0c;特别是用于衡量计算机每秒能够执行多少浮点运算。在高性能计算领域&#xff0c;FLOPS 被广泛用来评估超级计算机、CPU、GPU 和其他处理器…

2024年区块链链游即将迎来大爆发

随着区块链技术的不断发展和成熟&#xff0c;其应用领域也在不断扩展。其中&#xff0c;区块链链游&#xff08;Blockchain Games&#xff09;作为区块链技术在游戏行业中的应用&#xff0c;备受关注。2024年&#xff0c;区块链链游行业即将迎来爆发&#xff0c;这一趋势不容忽…

Windows10如何关闭Edge浏览器的Copilot

在Windows10更新后&#xff0c;打开Edge浏览器&#xff0c;无论复制什么内容&#xff0c;都会弹出Copilot人工智能插件&#xff0c;非常令人反感&#xff0c;网上搜索的关闭方法都非常麻烦&#xff0c;比如&#xff1a;组策略和注册表。自己摸索得出最简便有效的关闭方法。 1、…

【java毕业设计】 基于Spring Boot+mysql的高校心理教育辅导系统设计与实现(程序源码)-高校心理教育辅导系统

基于Spring Bootmysql的高校心理教育辅导系统设计与实现&#xff08;程序源码毕业论文&#xff09; 大家好&#xff0c;今天给大家介绍基于Spring Bootmysql的高校心理教育辅导系统设计与实现&#xff0c;本论文只截取部分文章重点&#xff0c;文章末尾附有本毕业设计完整源码及…

一致性hash

一、什么是一致性hash 普通的hash算法 (hashcode % size )&#xff0c;如果size发生变化&#xff0c;几乎所有的历史数据都需要重hash、移动&#xff0c;代价非常大&#xff0c;常见的java中的hashmap就是如此。 那如果在hash表扩容或者收缩的时候size能够保持不变&#xff0…

gitee / github 配置git, 实现免密码登录

文章目录 怎么配置公钥和私钥验证配置成功问题 怎么配置公钥和私钥 以下内容参考自 github ssh 配置&#xff0c;gitee的配置也是一样的&#xff1b; 粘贴以下文本&#xff0c;将示例中使用的电子邮件替换为 GitHub 电子邮件地址。 ssh-keygen -t ed25519 -C "your_emai…

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

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

VMware 15 安装centos7虚拟机

1. 安装前准备 1.1 下载centos 阿里巴巴开源镜像站-OPSX镜像站-阿里云开发者社区 下载需要版本的centos版本 直达链接 centos7.9 &#xff1a; centos-7.9.2009-isos-x86_64安装包下载_开源镜像站-阿里云 .基础使用的话安装选择这个就行了&#xff0c;大概下载几分钟 2. …

STM32 ADC采样:基础与实践

STM32的ADC采样是嵌入式系统设计中的一个重要环节&#xff0c;它涉及到模拟信号的采集和转换。以下是一篇关于STM32 ADC采样基础与实践的文章&#xff0c;包括一些基础的代码示例。 STM32 ADC采样&#xff1a;基础与实践 引言 STM32系列微控制器因其强大的ADC功能而广泛应用…

uniapp 开发H5中适配底部安全区域不生效的解决方法

在适配底部安全区域时我们通常会使用如下方法 box-sizing: content-box; padding-bottom: 0 !important; padding-bottom: constant(safe-area-inset-bottom) !important; padding-bottom: env(safe-area-inset-bottom) !important; 但是只是加上面的样式会发现并不起作用&…

linux负载均衡 和 系统负载分析笔记

1 负载均衡 1.1 计算负载 1.1.1 PELT算法简介 从Linux3.8内核以后进程的负载计算不仅考虑权重&#xff0c;⽽且跟踪每个调度实体的历史负载情况&#xff0c;该算法称为PELT(Per-entity Load Tracking) 《奔跑吧Linux内核》卷1&#xff1a;基础架构&#xff1b;P505 相关资料…

银河麒麟V10 SP1服务器客户端定时数据同步

银河麒麟V10 SP1服务器客户端定时数据同步 0.概述 当前只测试了将数据从客户端往服务端推送&#xff0c;两个客户端分别推送不同的数据 1.环境 三台电脑均为银河麒麟V10SP1桌面操作系统 服务器IP&#xff1a;192.168.1.51 用户名&#xff1a;wlh 客户端IP&#xff1a;192…

OpenStack云计算(十一)——OpenStack网络管理,验证OpenStack网络资源模型,验证来巩固和加深对OpenStack网络资源模型的理解

项目实训一 【实训题目】 验证OpenStack网络资源模型 【实训目的】 通过验证来巩固和加深对OpenStack网络资源模型的理解。 【实训准备】 &#xff08;1&#xff09;复习Neutron网络资源模型。 &#xff08;2&#xff09;重点理解网络、子网、端口和路由器的概念。 【实…