设计模式(一)预备知识
前言
学习设计模式需要有面向对象编程的基础,要基本掌握一种面向对象的编程语言。关于面向对象编程思想,我们有另外一篇文章专门讲解:面向过程和面向对象的联系和区别。
知识点
虚函数
在类的成员函数定义中,形式上为定义为virtual的函数叫虚函数。
如果虚函数后面有“= 0”,这个虚函数就是纯虚函数。
虚函数本身并不是一个真正的函数,它没有自己的函数地址。调用虚函数实际上是先去虚函数表中找函数指针,再进行调用。
对于虚函数,在运行时,基类会将虚函数表中的函数指针初始化为自己的函数地址;子类初始化时,会将其初始化为子类自己的函数地址,达到函数覆盖的效果。
对于纯虚函数,基类没有定义,所以基类只会将虚函数表中的函数指针初始化为NULL;子类初始化时,会将其初始化为子类自己的函数地址,达到函数覆盖的效果。
虚基类
包含纯虚函数的类,叫做虚基类。
多态
多态是指,当基类指针指向子类对象时,使用基类指针调用基类定义的虚函数,实际上调用的是此虚函数的子类实现。显然,多态是使用虚函数实现的。
继承
面向对象语言三大特性之一,这里不做详细说明。
接口
包含一系列虚函数的类,就叫做接口。它只定义函数,不关心如何实现。具体的功能实现任务交给继承自此接口的子类完成。接口正是利用的面向对象语言的多态特性。
接口,顾名思义,它连接了功能使用者和功能实现者,是负责二者之间交互的类,也是一种实现二者解耦的重要方法。
模块化
模块化是软件开发中无处不在的软件架构技术。它的核心思想是分而治之,即将一个大问题划分为相对独立的小问题,化繁为简,逐个击破,并最终通过模块间分工协作完成预期功能。
模块化思想存在于计算机技术的方方面面,各个层次。例如:
从硬件上来说,
- 计算机是由多个零部件组装而成的,每个零部件就是一个模块。存储器用于存储数据,CPU用于计算,输入输出设备用于数据交互;
从软件上来说,
- 一个函数就可以看做是一个模块,它通过计算解决了某一个小问题;
- 再向上一级,一个类就是一个模块,它通过将属性和方法封装起来,实现了一个具有某类功能的功能模块。
- 再向上一级,一个库(动态库或静态库)就是一个模块,它将某一问题领域所有的解决方案接口封装在一起,例如FFmpeg音视频处理库、pthread多线程库、zlib压缩库等等。
- 再向上一级,每一个软件本身,也是一个模块,这个软件为解决某一领域内的问题,提供了完整的交互流程、各个方面的功能。
- 再向上一级,到分布式系统中,某一计算机集群也是一个模块,它是为了稳定地对外提供某一种计算服务。
- 以此类推。
模块化无处不在,是人类处理复杂问题的法宝。模块化除了可以降低系统复杂度,模块化还便于多人协作。当系统模块化分解以后,各个模块的制作可以同时进行,并行开发,大大加快系统开发进度。
封装
下面来说说封装。封装是实现模块化的核心技术。
封装是隐藏一些东西,暴露一些东西。正是有一些东西被隐藏起来,才实现了问题的简化。暴露出来的东西的数量相对于隐藏起来的东西的数量微乎其微。使用者只需要关心暴露出来的接口如何使用即可。当每个模块都能使问题复杂度收敛,那么系统整体的复杂度就会下降,整个系统就能做得很大,实现起来也更容易。
结语
本文讲解了学习设计模式所需要的预备知识,这些预备知识是理解设计模式的基础,同时这些知识也是贯穿软件开发过程中的核心理念,必须要多思考多理解多应用。
本文原创首发于微信公众号:Qt未来工程师。
设计模式(一)预备知识相关推荐
- 机器学习应该准备哪些数学预备知识?
转 https://www.zhihu.com/question/36324957 https://www.zhihu.com/question/36324957/answer/139408269 机 ...
- word2vec 中的数学原理详解(二)预备知识
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/peghoty/article/details/37969635 https://blog.csdn. ...
- 计算机视觉预备知识,计算机视觉:泊松融合
Poisson Blending4:更多用途 Poisson Blending0:预备知识(图像的梯度.泊松方程) 进入正题之前,我们先补充一下基础知识.图像的梯度 什么是图像的梯度?我们可以把图像看 ...
- 学习SLAM需要哪些预备知识?
点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 编辑:3D视觉工坊 链接:https://www.zhihu.com/question/3518606 ...
- [转]预备知识—程序的内存分配
因为经典,所以转发. 一.预备知识-程序的内存分配 一个由C/C++编译的程序占用的内存分为以下几个部分 栈区(stack) - 由编译器自动分配释放,存放函数的参数值,局部变量的值等.其操作方 ...
- 一步一步学Linq to sql(一):预备知识
从今天起将推出新手讲堂,首先从linq开始详细讲解.一步一步学Linq to sql(一):预备知识 什么是Linq to sql Linq to sql(或者叫DLINQ)是LINQ(.NET语言集 ...
- 用计算机语言编写的完成一定功能,C+的+预备知识.ppt
C的预备知识 * (顺序语句.选择语句.循环语句FOR及嵌套) C++讲义 预知识:程序设计.算法和C++ 第一章:顺序结构 1.1标准数据类型和变量的定义 1.2 运算符.标准函数和表达式 1.4基 ...
- 微积分笔记(一)--预备知识
文章目录 预备知识 什么是微积分 一. 直线 1.1 增量 1.2 直线的斜率 1.3 平行线和垂直线 1.4 直线的方程 二.函数和图形 2.1 映射 2.2 逆映射与复合映射 2.3 函数 2.4 ...
- 基于python的nlp预备知识
基于python的nlp预备知识 载入语料库 brown 语料库的导入 分词 nltk的word_tokenize Stem抽取题干和Lemma 词形还原 NLTK实现Stemming三种方式 NLT ...
最新文章
- Mybatis的工作原理,你了解过吗?
- 关于Vue中常用的工具函数封装
- XSS漏洞自动化攻击工具XSSer
- 有汇编功能的python编译器_7.12 计算机基础理念与python解释器编译器安装使用
- MySQL中述职类型的长度问题
- 内建控制结构之if表达式
- linux c之命名管道简单使用
- 提搞网站访问速度可做哪些优化
- Keil 中的Code, RO-data , RW-data, ZI-data
- 阶段3 3.SpringMVC·_01.SpringMVC概述及入门案例_05.入门程序之入门代码编写
- ISO50001认证辅导,体系要求组织建立能源管理基准、标杆以及目标指标,对节能效果进行量化
- 计算机文件及文件夹管理实验报告,计算机实验报告
- 数据库事务的四大特性
- 机械硬盘和固态硬盘之间的区别
- 中文不能输入超过20,英文输入不能超过40个
- 一个 Gitlab 帐号无法访问文件、克隆项目问题的解决
- win10永久关闭自动更新方法
- java关于hashmap编程题_在Java中,关于HashMap类的描述,以下说法错误的是( )。...
- FMU主板程序更新说明
- MySQL实战开发技巧
热门文章
- 设计模式 学习笔记(2)单一职责原则、开放封闭原则、依赖倒转原则
- 生命、生活:同样重要
- [剑指offer]面试题第[55-2]题[Leetcode][第110题][JAVA][平衡二叉树][DFS][剪枝]
- 工厂方法模式_1天1个设计模式——工厂方法模式
- python怎么读取github_六行代码获取Github排名前10的Python项目
- outlook2013邮箱找不到服务器,outlook发邮件总提示找不到
- 1668智能下数教程视频_你需要的教程合集更新
- 判断一个数是偶数还是奇数
- oracle sal01,oracle中 all any in的用法
- 3-5 单链表分段逆转 (20 分)