C++设计模式介绍与分类
目录
一、设计模式定义
二、设计模式的优点
三、设计模式缺点
四、设计模式中的抽象思维
五、抽象的方法
六、设计模式应用场景
七、设计模式分类
附加知识
(1)C++面向对象三种访问修饰符
(2)父类析构函数必须为虚函数
(3)override关键字使用
(4)final关键字使用
(5)父类对象可以与子类对象相互转化吗?
(6)虚函数、虚函数表介绍
一、设计模式定义
是一套被反复使用的代码设计经验的总结,是经过提炼的出色设计方法。设计模式主要是指面向对象这种编程模型下的设计模式。
二、设计模式的优点
设计模式一般应用于大型项目中,设计模式可以使各模块之间的代码灵活性和可复用性增强。
灵活性是指:可扩展性和低耦合型;增加新的功能,不需要大范围修改代码。
可复用性是指:可以到处重复使用,面向对象的三大特性:封装、继承、多态。泛型编程。面向对象程序设计原则之一:单一原则(一个类只干好一件事,不涉及其他事物)
三、设计模式缺点
代码的复杂度增加,增加了学习和阅读的负担,设计模式在一定程序会降低代码运行效率(对于带来的优点其下降运行效率一般可忽略)。
应用设计模式不当导致的代码灵活性、可复用性、可读性下降。
四、设计模式中的抽象思维
抽象思维强调对象的本质属性,主要用于一些软件设计中的解耦合的过程。
抽象思维的概念:能从事物中抽取出或者提炼出一些本质的,共性的内容,把这些共性的内容组合到一起封装成一个类或者方法。继承抽象类的子类都有不同的特点进行扩展。
五、抽象的方法
1、分解法:把一个复杂的事物分解成若干个单一功能的事物。
2、抽象法:从每个简单的事物中,抽象出本质的内容,封装起来。
六、设计模式应用场景
通常应用于大型项目(几万到几十万行代码及以上项目),不建议应用于小型项目(小型项目要是适合也可使用设计模式)。对于大量重复性代码,需要使用设计模式进行设计,提高代码扩展性。
七、设计模式分类
常用的设计模式可以分为三大类:行为型模式、创建型模式、结构型模式
(1)创建型模式有6种:简单工厂模式(Simple Factory)、工厂方法模式(Factory Method)、抽象工厂模式(Abstract Factory)、单例模式(Singleton)、原型模式(Prototype)、建造者模式(Builder)。
(2)结构性模式有7种:装饰模式(Decorator)、外观模式(Facade)、组合模式(Composite)、享元模式(Flyweight)、代理模式(Proxy)、适配器模式(Adapter)、桥接模式(Bridge)
(3)行为型模式包括的设计模式有11种:模板方法模式(Template Method)、策略模式(Strategy)、观察者模式(Observer)、命令模式(Command)、迭代器模式(Iterator)、状态模式(State)、
中介模式(Mediator)、备忘录模式(Memento)、职责链模式(Chain Of Responsibility)、解释器模式(Interpreter)、访问者模式(Visitor)。
创建型模式定义:关注如何创建对象,将对象的创建和使用相互分离(解耦),取代传统对象创建方式带来的扩展性差的问题。
结构型模式:关注对象之间的关系。涉及如何组合各种对象以便获得更加灵活的结构,通过继承以及更多的关系组合获得更加灵活的程序结构。达到简化设计模式。
行为模式定义:关注对象的行为或者交互方面的内容,主要涉及算法和对象之间的职责分配。通过使用对象组合,行为模式可以描述一组对象如何协作来完成一个整体任务。
注意:设计模式代码一般不是一次设计设计好的,是多次修改而成。软件开发需求变化是频繁的,尝试寻找变化点,把变化部分和稳定部分分离开发,在变化的地方使用设计模式。
附加知识
设计模式主要利用类的多态、继承、封装方法对事物进行抽象设计。并对共用的属性和方法抽象成基类,对变化的属性使用虚函数进行多态设计。对面向对象的相关知识点可以进行回顾
(1)C++面向对象三种访问修饰符
public: 允许该类函数、子类函数、友元函数、该类对象可以访问。
protected:只允许该类函数、子类函数、友元函数可以访问。
private:只允许奔雷的成员函数可以访问。
具体可参考:
C++中public、protected、private的区别_风雨也无晴的博客-CSDN博客
友元(友元函数、友元类和友元成员函数) C++_夜雨听萧瑟的博客-CSDN博客
(2)父类析构函数必须为虚函数
定义父类对象初始化时,让父类对象实际指向子类。同时父类析构函数必须为虚函数,这样在父类对象析构时,不会调用子类的虚构函数,导致子类的对象不能释放,造成子类对象的内存泄露。具体可参考:为什么父类析构函数必须为虚函数_父类析构函数不是虚函数会怎么样_IM-STONE的博客-CSDN博客
(3)override关键字使用
在子类中重写父类的虚函数时,在其后面加上override关键字,如果父类不存在该虚函数,则编译不通过。
class A
{
public:virtual void FunA()=0; //纯虚函数,子类必须实现该函数。virtual int FunB(){}; //虚函数,子类可以重写,也可以不用重写
}class B:public A
{public:void FunA()override{};int FunB()override{};
}
C++:重载,重定义,重写的区别_重定义和重写的区别__来信的博客-CSDN博客
(4)final关键字使用
如果当前类不能有派生类,则可以在类后面添加关键字final;如果不想该虚函数不被重写,在该虚函数后面添加final。如果继承final类或者重载final修饰的函数,会导致编译报错。
class A final //用法1:该类不能被继承。
{}class B
{
public:virtual void fun()final{}; //用法2:该虚函数不能被重写。
}
C++ final关键字_mayue_csdn的博客-CSDN博客
(5)父类对象可以与子类对象相互转化吗?
父类对象与子类对象可以相互转换,前提是父类对象一定是用子类对象初始化的。子类对象是对父类对象的扩展,子类属性一般是大于父类属性。
具体分析可参考:父类对象和子类对象之间可以相互转换吗_父对象转成子对象_扶公瑾以苏的博客-CSDN博客
(6)虚函数、虚函数表介绍
可参考下面链接
(超重要)构造函数为什么不能为虚函数?析构函数为什么要虚函数?_构造函数能不能为虚函数_HeisenbergWDG的博客-CSDN博客
C++中虚函数、虚指针和虚表详解_bob62856的博客-CSDN博客
C++中的虚函数表和虚函数在内存中的位置_虚函数表存在什么位置_HerofH_的博客-CSDN博客
相关文章:
C++设计模式介绍与分类
目录 一、设计模式定义 二、设计模式的优点 三、设计模式缺点 四、设计模式中的抽象思维 五、抽象的方法 六、设计模式应用场景 七、设计模式分类 附加知识 (1)C面向对象三种访问修饰符 (2)父类析构函数必须为虚函数 &…...
【Redis25】Redis进阶:分布式锁实现
Redis进阶:分布式锁实现 锁这个概念,不知道大家掌握的怎么样。我是先通过 Java ,知道在编程语言中是如何使用锁的。一般 Java 的例子会是操作一个相同的文件,但其实我们知道,不管是文件,还是数据库中的一条…...
【蓝桥杯算法题】输入输出流问题
【蓝桥杯算法题】输入输出流问题 题目:对文本文件进行带缓存的读写操作,可以读取文件不同位置的信息,可以进行对象序列化和对象反序列化。解释:总结: 题目:对文本文件进行带缓存的读写操作,可以…...
BUG提交单模版一
提交人员 XX 提交时间 2005-06-16 产品名称...
Android 12.0系统默认授予读写权限给第三方app
1.概述 在12.0的系统rom定制化开发中, 在6.0以前读写权限是默认授予的,app不需要申请权限 在10.0之前需要android.permission.WRITE_EXTERNAL_STORAGE和android.permission.READ_EXTERNAL_STORAGE 权限就可以了而在安卓11的时候继续强化对SD卡读写的管理,引入了MANAGE_EXTER…...
【生信】R语言在RNA-seq中的应用
R语言在RNA-seq中的应用 文章目录 R语言在RNA-seq中的应用生成工作流环境读取和处理数据由targets文件提供实验定义对实验数据进行质量过滤和修剪生成FASTQ质量报告 比对建立HISAT2索引并比对 读长量化读段计数样本间的相关性分析 差异表达分析运行edgeR可视化差异表达结果计算…...
【嵌入式环境下linux内核及驱动学习笔记-(14)linux总线、设备、驱动模型之platform】
目录 1、新驱动架构的导入1.1 传统驱动方式的痛点1.2 总线设备驱动架构 2、platform 设备驱动2.1 platform总线式驱动的架构思想2.2 platform _device相关的数据类型2.2.1 struct platform_device2.2.2 struct platform_device_id2.2.3 struct resource2.2.4 struct device 2.3…...
绝地求生 压q python版
仅做学习交流,非盈利,侵联删(狗头保命) 一、概述 1.1 效果 总的来说,这种方式是通过图像识别来完成的,不侵入游戏,不读取内存,安全不被检测。 1.2 前置知识 游戏中有各种不同的q械…...
云原生技术中的容器技术有哪些?
文章目录 云原生技术中的容器技术有哪些1、云原生的含义2、容器的含义3、云原生的技术的基石:容器技术4、容器技术有哪些? 结语 云原生技术中的容器技术有哪些 在现今的安全行业中云原生安全技术中的容器安全技术有哪些呢,很多用户都不知道具体的含义以…...
Gin中间件的详解 ,用Jwt-go 和 Gin 的安全的登陆的中间件
学习目标: Gin 在不同的group 设置不同的中间件或者过滤器 Gin 的group下的路由上中间件或过滤器 用Jwt-go 和 Gin 的安全的登陆的中间件 JWT 类,它基本有所有基本功能,包括:GenerateToken,GenerateRefreshToken, ValidateToken, ParseToken 学习内容: 1. Gin 在不同的g…...
Nginx网站部署
Nginx网站部署 一、访问状态统计配置二、基于授权的访问控制三、基于客户端的访问控制四、基于域名的 Nginx 虚拟主机五、基于IP 的 Nginx 虚拟主机六、基于端口的 Nginx 虚拟主机 一、访问状态统计配置 1.先使用命令/usr/local/nginx/sbin/nginx -V 查看已安装的 Nginx 是否包…...
Hadoop优化
1.小文件 影响: 元数据的瓶颈在于文件的数量,无论单个文件的大小 资源大材小用 优化 计算:使用combininputformat提前合并小文件 JVM重用 存储:归档 2.map端 环形缓冲区-区域大小、溢写比列 提前combinerÿ…...
FPGA设计的指导性原则 (中)
1.6基本设计思想与技巧之二:串并转换 串并转换是FPGA设计的一个重要技巧,从小的着眼点讲,它是数据流处理的常用手 段,从大的着眼点将它是面积与速度互换思想的直接体现。串并转换的实现方法多种多样, 根据数据的排序和数量的要求,可以选用寄存器、RAM等实现。前面在乒乓…...
开源创新 协同融合|2023 开放原子全球开源峰会开源协作平台分论坛即将启幕
由开放原子开源基金会主办,阿里云、CSDN 等单位共同承办的开源协作平台分论坛即将于 6 月 12 日上午在北京经开区北人亦创国际会展中心隆重召开。作为 2023 开放原子全球开源峰会的重要组成部分,开源协作平台分论坛将聚焦于开源代码平台的创新功能、用户…...
第四章 相似矩阵与矩阵对角化
引言 题型总结中推荐例题有蓝皮书的题型较为重要,只有吉米多维奇的题型次之。码字不易,如果这篇文章对您有帮助的话,希望您能点赞、评论、收藏,投币、转发、关注。您的鼓励就是我前进的动力! 知识点思维导图 补充&…...
课程11:仓储层Repository实现、AutoMapper自动映射
课程简介目录 🚀前言一、Repository项目1.1创建Repository项目1.2 添加类1.2.1、添加类 RolePermissionRepositiory1.2.2、添加项目引用1.2.3、注入数据库上下文1.3 RolePermissionRepositiory接口的实现二、Repository注入2.1 提取接口2.2 添加项目依赖2.3 项目入口添加依赖…...
关于作用域的那些事(进阶)
一、作用域 原理: 作用域 > 房子 > 除了对象的{}都构成一个作用域 作用域 > 为了区别变量.不同作用域内声明的变量是各不相同的.(就算名字相同). 作用域语法: let x 10; (全局变量). if () {块级作用域 let y 20; (局部变量)} for () {块级作用…...
小技巧notebook
小技巧notebook 1、MybatisPlus 批量保存 从BaseMapper接口方法可知,mybatis plus mapper只有根据id批量删除和查询,没有批量保存(insert 、update),要实现也很简单,需要定义一个Service Service Slf4j …...
【2451. 差值数组不同的字符串】
来源:力扣(LeetCode) 描述: 给你一个字符串数组 words ,每一个字符串长度都相同,令所有字符串的长度都为 n 。 每个字符串 words[i] 可以被转化为一个长度为 n - 1 的 差值整数数组 difference[i] &…...
Java面试-每日十题
目录 1.try-catch-finally中的finally的执行机制 2.什么是Exception和Error 3.Throw和Throws的区别 4.Error与Exception区别 5.Java中的I/O流是什么,分为几类 6.I/O与NI/O 7.常用的I/O的类有哪些 8.字符流与字节流的区别 9.Java反射创建对象 10.什么是类的…...
大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...
使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...
vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
如何在最短时间内提升打ctf(web)的水平?
刚刚刷完2遍 bugku 的 web 题,前来答题。 每个人对刷题理解是不同,有的人是看了writeup就等于刷了,有的人是收藏了writeup就等于刷了,有的人是跟着writeup做了一遍就等于刷了,还有的人是独立思考做了一遍就等于刷了。…...
云原生安全实战:API网关Kong的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关(API Gateway) API网关是微服务架构中的核心组件,负责统一管理所有API的流量入口。它像一座…...
【C++特殊工具与技术】优化内存分配(一):C++中的内存分配
目录 一、C 内存的基本概念 1.1 内存的物理与逻辑结构 1.2 C 程序的内存区域划分 二、栈内存分配 2.1 栈内存的特点 2.2 栈内存分配示例 三、堆内存分配 3.1 new和delete操作符 4.2 内存泄漏与悬空指针问题 4.3 new和delete的重载 四、智能指针…...
用神经网络读懂你的“心情”:揭秘情绪识别系统背后的AI魔法
用神经网络读懂你的“心情”:揭秘情绪识别系统背后的AI魔法 大家好,我是Echo_Wish。最近刷短视频、看直播,有没有发现,越来越多的应用都开始“懂你”了——它们能感知你的情绪,推荐更合适的内容,甚至帮客服识别用户情绪,提升服务体验。这背后,神经网络在悄悄发力,撑起…...
