设计模式(一)预备知识

前言

学习设计模式需要有面向对象编程的基础,要基本掌握一种面向对象的编程语言。关于面向对象编程思想,我们有另外一篇文章专门讲解:面向过程和面向对象的联系和区别


知识点

虚函数

在类的成员函数定义中,形式上为定义为virtual的函数叫虚函数。

如果虚函数后面有“= 0”,这个虚函数就是纯虚函数。

虚函数本身并不是一个真正的函数,它没有自己的函数地址。调用虚函数实际上是先去虚函数表中找函数指针,再进行调用。

对于虚函数,在运行时,基类会将虚函数表中的函数指针初始化为自己的函数地址;子类初始化时,会将其初始化为子类自己的函数地址,达到函数覆盖的效果。

对于纯虚函数,基类没有定义,所以基类只会将虚函数表中的函数指针初始化为NULL;子类初始化时,会将其初始化为子类自己的函数地址,达到函数覆盖的效果。

虚基类

包含纯虚函数的类,叫做虚基类。

多态

多态是指,当基类指针指向子类对象时,使用基类指针调用基类定义的虚函数,实际上调用的是此虚函数的子类实现。显然,多态是使用虚函数实现的。

继承

面向对象语言三大特性之一,这里不做详细说明。

接口

包含一系列虚函数的类,就叫做接口。它只定义函数,不关心如何实现。具体的功能实现任务交给继承自此接口的子类完成。接口正是利用的面向对象语言的多态特性。
接口,顾名思义,它连接了功能使用者和功能实现者,是负责二者之间交互的类,也是一种实现二者解耦的重要方法。

模块化

模块化是软件开发中无处不在的软件架构技术。它的核心思想是分而治之,即将一个大问题划分为相对独立的小问题,化繁为简,逐个击破,并最终通过模块间分工协作完成预期功能。

模块化思想存在于计算机技术的方方面面,各个层次。例如:

从硬件上来说,

  • 计算机是由多个零部件组装而成的,每个零部件就是一个模块。存储器用于存储数据,CPU用于计算,输入输出设备用于数据交互;

从软件上来说,

  • 一个函数就可以看做是一个模块,它通过计算解决了某一个小问题;
  • 再向上一级,一个类就是一个模块,它通过将属性和方法封装起来,实现了一个具有某类功能的功能模块。
  • 再向上一级,一个库(动态库或静态库)就是一个模块,它将某一问题领域所有的解决方案接口封装在一起,例如FFmpeg音视频处理库、pthread多线程库、zlib压缩库等等。
  • 再向上一级,每一个软件本身,也是一个模块,这个软件为解决某一领域内的问题,提供了完整的交互流程、各个方面的功能。
  • 再向上一级,到分布式系统中,某一计算机集群也是一个模块,它是为了稳定地对外提供某一种计算服务。
  • 以此类推。

模块化无处不在,是人类处理复杂问题的法宝。模块化除了可以降低系统复杂度,模块化还便于多人协作。当系统模块化分解以后,各个模块的制作可以同时进行,并行开发,大大加快系统开发进度。

封装

下面来说说封装。封装是实现模块化的核心技术。

封装是隐藏一些东西,暴露一些东西。正是有一些东西被隐藏起来,才实现了问题的简化。暴露出来的东西的数量相对于隐藏起来的东西的数量微乎其微。使用者只需要关心暴露出来的接口如何使用即可。当每个模块都能使问题复杂度收敛,那么系统整体的复杂度就会下降,整个系统就能做得很大,实现起来也更容易。


结语

本文讲解了学习设计模式所需要的预备知识,这些预备知识是理解设计模式的基础,同时这些知识也是贯穿软件开发过程中的核心理念,必须要多思考多理解多应用。


本文原创首发于微信公众号:Qt未来工程师。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

撬动未来的支点

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值