设计模式(一)预备知识
前言
学习设计模式需要有面向对象编程的基础,要基本掌握一种面向对象的编程语言。关于面向对象编程思想,我们有另外一篇文章专门讲解:面向过程和面向对象的联系和区别。
知识点
虚函数
在类的成员函数定义中,形式上为定义为virtual的函数叫虚函数。
如果虚函数后面有“= 0”,这个虚函数就是纯虚函数。
虚函数本身并不是一个真正的函数,它没有自己的函数地址。调用虚函数实际上是先去虚函数表中找函数指针,再进行调用。
对于虚函数,在运行时,基类会将虚函数表中的函数指针初始化为自己的函数地址;子类初始化时,会将其初始化为子类自己的函数地址,达到函数覆盖的效果。
对于纯虚函数,基类没有定义,所以基类只会将虚函数表中的函数指针初始化为NULL;子类初始化时,会将其初始化为子类自己的函数地址,达到函数覆盖的效果。
虚基类
包含纯虚函数的类,叫做虚基类。
多态
多态是指,当基类指针指向子类对象时,使用基类指针调用基类定义的虚函数,实际上调用的是此虚函数的子类实现。显然,多态是使用虚函数实现的。
继承
面向对象语言三大特性之一,这里不做详细说明。
接口
包含一系列虚函数的类,就叫做接口。它只定义函数,不关心如何实现。具体的功能实现任务交给继承自此接口的子类完成。接口正是利用的面向对象语言的多态特性。
接口,顾名思义,它连接了功能使用者和功能实现者,是负责二者之间交互的类,也是一种实现二者解耦的重要方法。
模块化
模块化是软件开发中无处不在的软件架构技术。它的核心思想是分而治之,即将一个大问题划分为相对独立的小问题,化繁为简,逐个击破,并最终通过模块间分工协作完成预期功能。
模块化思想存在于计算机技术的方方面面,各个层次。例如:
从硬件上来说,
- 计算机是由多个零部件组装而成的,每个零部件就是一个模块。存储器用于存储数据,CPU用于计算,输入输出设备用于数据交互;
从软件上来说,
- 一个函数就可以看做是一个模块,它通过计算解决了某一个小问题;
- 再向上一级,一个类就是一个模块,它通过将属性和方法封装起来,实现了一个具有某类功能的功能模块。
- 再向上一级,一个库(动态库或静态库)就是一个模块,它将某一问题领域所有的解决方案接口封装在一起,例如FFmpeg音视频处理库、pthread多线程库、zlib压缩库等等。
- 再向上一级,每一个软件本身,也是一个模块,这个软件为解决某一领域内的问题,提供了完整的交互流程、各个方面的功能。
- 再向上一级,到分布式系统中,某一计算机集群也是一个模块,它是为了稳定地对外提供某一种计算服务。
- 以此类推。
模块化无处不在,是人类处理复杂问题的法宝。模块化除了可以降低系统复杂度,模块化还便于多人协作。当系统模块化分解以后,各个模块的制作可以同时进行,并行开发,大大加快系统开发进度。
封装
下面来说说封装。封装是实现模块化的核心技术。
封装是隐藏一些东西,暴露一些东西。正是有一些东西被隐藏起来,才实现了问题的简化。暴露出来的东西的数量相对于隐藏起来的东西的数量微乎其微。使用者只需要关心暴露出来的接口如何使用即可。当每个模块都能使问题复杂度收敛,那么系统整体的复杂度就会下降,整个系统就能做得很大,实现起来也更容易。
结语
本文讲解了学习设计模式所需要的预备知识,这些预备知识是理解设计模式的基础,同时这些知识也是贯穿软件开发过程中的核心理念,必须要多思考多理解多应用。
本文原创首发于微信公众号:Qt未来工程师。
本文来自博客园,作者:撬动未来的支点,转载请注明原文链接:https://www.cnblogs.com/pivotfuture/p/16297329.html
CSDN:撬动未来的支点,公众号:Qt未来工程师,网站:www.qtfuture.cn
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!