前言

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


知识点

虚函数

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

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

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

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

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

虚基类

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

多态

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

继承

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

接口

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

模块化

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

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

从硬件上来说,

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

从软件上来说,

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

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

封装

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

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


结语

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


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

设计模式(一)预备知识相关推荐

  1. 机器学习应该准备哪些数学预备知识?

    转 https://www.zhihu.com/question/36324957 https://www.zhihu.com/question/36324957/answer/139408269 机 ...

  2. word2vec 中的数学原理详解(二)预备知识

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/peghoty/article/details/37969635 https://blog.csdn. ...

  3. 计算机视觉预备知识,计算机视觉:泊松融合

    Poisson Blending4:更多用途 Poisson Blending0:预备知识(图像的梯度.泊松方程) 进入正题之前,我们先补充一下基础知识.图像的梯度 什么是图像的梯度?我们可以把图像看 ...

  4. 学习SLAM需要哪些预备知识?

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 编辑:3D视觉工坊 链接:https://www.zhihu.com/question/3518606 ...

  5. [转]预备知识—程序的内存分配

    因为经典,所以转发. 一.预备知识-程序的内存分配 一个由C/C++编译的程序占用的内存分为以下几个部分 栈区(stack)  -   由编译器自动分配释放,存放函数的参数值,局部变量的值等.其操作方 ...

  6. 一步一步学Linq to sql(一):预备知识

    从今天起将推出新手讲堂,首先从linq开始详细讲解.一步一步学Linq to sql(一):预备知识 什么是Linq to sql Linq to sql(或者叫DLINQ)是LINQ(.NET语言集 ...

  7. 用计算机语言编写的完成一定功能,C+的+预备知识.ppt

    C的预备知识 * (顺序语句.选择语句.循环语句FOR及嵌套) C++讲义 预知识:程序设计.算法和C++ 第一章:顺序结构 1.1标准数据类型和变量的定义 1.2 运算符.标准函数和表达式 1.4基 ...

  8. 微积分笔记(一)--预备知识

    文章目录 预备知识 什么是微积分 一. 直线 1.1 增量 1.2 直线的斜率 1.3 平行线和垂直线 1.4 直线的方程 二.函数和图形 2.1 映射 2.2 逆映射与复合映射 2.3 函数 2.4 ...

  9. 基于python的nlp预备知识

    基于python的nlp预备知识 载入语料库 brown 语料库的导入 分词 nltk的word_tokenize Stem抽取题干和Lemma 词形还原 NLTK实现Stemming三种方式 NLT ...

最新文章

  1. Mybatis的工作原理,你了解过吗?
  2. 关于Vue中常用的工具函数封装
  3. XSS漏洞自动化攻击工具XSSer
  4. 有汇编功能的python编译器_7.12 计算机基础理念与python解释器编译器安装使用
  5. MySQL中述职类型的长度问题
  6. 内建控制结构之if表达式
  7. linux c之命名管道简单使用
  8. 提搞网站访问速度可做哪些优化
  9. Keil 中的Code, RO-data , RW-data, ZI-data
  10. 阶段3 3.SpringMVC·_01.SpringMVC概述及入门案例_05.入门程序之入门代码编写
  11. ISO50001认证辅导,体系要求组织建立能源管理基准、标杆以及目标指标,对节能效果进行量化
  12. 计算机文件及文件夹管理实验报告,计算机实验报告
  13. 数据库事务的四大特性
  14. 机械硬盘和固态硬盘之间的区别
  15. 中文不能输入超过20,英文输入不能超过40个
  16. 一个 Gitlab 帐号无法访问文件、克隆项目问题的解决
  17. win10永久关闭自动更新方法
  18. java关于hashmap编程题_在Java中,关于HashMap类的描述,以下说法错误的是( )。...
  19. FMU主板程序更新说明
  20. MySQL实战开发技巧

热门文章

  1. 设计模式 学习笔记(2)单一职责原则、开放封闭原则、依赖倒转原则
  2. 生命、生活:同样重要
  3. [剑指offer]面试题第[55-2]题[Leetcode][第110题][JAVA][平衡二叉树][DFS][剪枝]
  4. 工厂方法模式_1天1个设计模式——工厂方法模式
  5. python怎么读取github_六行代码获取Github排名前10的Python项目
  6. outlook2013邮箱找不到服务器,outlook发邮件总提示找不到
  7. 1668智能下数教程视频_你需要的教程合集更新
  8. 判断一个数是偶数还是奇数
  9. oracle sal01,oracle中 all any in的用法
  10. 3-5 单链表分段逆转 (20 分)