设计模式(一)预备知识

前言

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


知识点

虚函数

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

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

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

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

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

虚基类

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

多态

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

继承

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

接口

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

模块化

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

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

从硬件上来说,

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

从软件上来说,

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

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

封装

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

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


结语

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


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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/436974.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【转】GitHub 从单机到联机:玩转 Pull Request

最近在参与一个叫 Exercism 的项目,这是一个由 GitHub 生态工程师 Katrina Owen 发起的编程练习社区,提供了超过50门语言的练习。作为用户,你仅需使用命令行工具即可下载和提交练习,提交后还可以和社区中其他学习者交流讨论。 Exe…

android cmake 打印_Android使用CMAKE编译libjpeg

本文主要介绍使用 CMAKE 编译 libjpeg-turbo 类库,本文相关代码请在GitHub-TurboJpegSample 查看。libjpeg-turbo 附GitHub 地址,libjpeg-turbo 是个运用极其广泛的库,可以说,基本上电脑上手机上能见到的 JPEG 压缩的地方用的一般…

设计模式(四)结构型模式

前言 结构型设计模式,主要研究: 主要有哪些场景使用结构型设计模式;每种场景应该使用何种设计模式;以程序中的功能为核心,研究程序功能的组织结构。所以这一章,我们要把“功能结构”作为研究的核心。 下…

centos 删除crontab_centos下crontab的使用

4.cron文件语法:分 小时 日 月 星期 命令0-59 0-23 1-31 1-12 0-6 command (取值范围,0表示周日一般一行对应一个任务)5.记住几个特殊符号的含义:“*”代表取值范围内的数字,“/”代表”每”,“-”代表从某个数字到某个数字,“,”分开…

【转】GitHub客户端操作1--仓库相关操作github团队协作流程

1、创建仓库 点击“”,点击Create,然后填写Name为my,点击Create repository,即可创建一个my仓库 2、从本地仓库存放位置,添加test仓库到GitHub客户端 点击“”,点击Add,然后点击Browse,选择仓库存放位置&a…

音视频相关链接

开发库 FFmpeg FFmpeg官网 FFmpeg github 平台相关 DirectShow DirectShow简介 DirectShow官网

【转】GitHub客户端操作2--分支操作

简单分支操作 (1)创建新分支:my分支 备注:新创建的分支:my分支里面的内容是和master分支里面的内容是完全一样的。 (2)删除my分支 (3)修改my分支【在my分支上进行项目内…

uniapp动态修改样式_uniapp样式动态绑定

场景一:用户点击按钮后动态切换按钮选中样式(如图)已上线未开始//选择状态selectState(e){this.whichSelectede.currentTarget.dataset.state}.state-btn-content{//write your style.state-btn-selected{ ... }.state-btn-noselect{ ... }}注:需要注意的…

音视频工程师(初步)(一)音视频的基本概念

1. 前言 本文是音视频工程师系列的第一篇文章。 学习音视频的过程中发现,网络上高质量的音视频技术博客不是很多。具有代表性的是 雷神的 雷霄骅的CSDN博客 因为笔者是一名普通的软件开发人员,一向不喜欢高高在上或者晦涩难懂的理论,我们…

【转】GitHub客户端操作3--pull Request(拉请求)

一、参考说明 参考文章一:Github上提交代码(pullrequest) 网址: https://jingyan.baidu.com/article/358570f64dcdc2ce4724fc32.html 参考文章二:GitHub——Pull Request 网址:http://blog.csdn.net/u012325167/article/detai…

webstorm 内存溢出怎么弄_webstrom 内存溢出,软件崩溃卡死解决的方法

今天用gulp搭建了一个工程,准备做一个体育h5的项目,其中需要用到sass代码压缩,加版本号等功能.gulpfile.js和package.json都是已经写好的.我用CMD命令窗口cnpm安装node_modules依赖文件.当我安装完毕之后用webstrom打开时,第一件事先把node_modules排除忽略了.如下:然后我去编辑…

躺平也要看,2022年计算机相关考试汇总

1. 全国计算机专业资格考试(软考) 1.1 官网 全国官网:https://www.ruankao.org.cn/,从全国官网首页的底部可以直达各个省区的考试机构报名网站。 1.2 考试安排 软考一年两次。 场次报名时间考试时间上半年 预计报名时间在2月…

【转】GitHub上README.md教程

本文是转载文章,文章的来源:csdn博客 博主:果冻虾仁 文章: GitHub上README写法暨GFM语法解读 博文地址:https://blog.csdn.net/guodongxiaren/article/details/23690801 转载请保留原作者guodongxiaren的原文地址&…

python supervisor flask_supervisor配合uwsgi部署flask应用

这已经是第N次来部署flask应用了, 但是每次都花了不少时间在配置上面, 这里一次性记录下, 备个忘~写在前面其实使用uwsgi来部署flask应用在官网上已经有较为详细的 文档 了, 推荐先读一下.先解决一些问题:为何使用 uwsgi 来部署应用? 方便管理; 较为常见的部署方式; 可配置性较…

设计模式(五)行为型模式

前言 在上一篇结构型模式中,我们以功能为基本单位,研究了一些设计模式,用于实现功能转换、功能组合、功能封装等目的。 我们知道,面向对象编程有两个核心元素:对象、对象间通信协作。从面向对象的角度看,…

51单片机auxr寄存器_51—52系列单片机特殊功能寄存器一览表

P2.1P2.0RSTP3.0/RXDP3.1/TXDXTAL2XTAL1P3.2/INT0P3.3/INT1P3.4/T0P3.5/T1GNDVCCP1.7P1.6P1.5P1.4P1.3P1.2P1.1/AIN1P1.0/AIN0P3.7注:类似的还有Philips公司的87LPC64,20引脚8XC748/750/(751),24引脚8X749(752),28引脚8XC754&…

【转】WPF单位真的与分辨率无关吗?

转载自http://www.cnblogs.com/helloj2ee/archive/2009/04/21/1440709.htm WPF从发布之日起,一直将“分辨率无关(resolution independence)”作为其亮点,声称使用WPF制作的用户界面在轻巧的Ultra-Mobile PC的屏幕上和在50英寸的电视机上都能很好地显示。…

设计模式(六)J2EE 模式

前言 本章设计模式只挑了一些必要的加以讲解,因为有的设计模式过于简单或者根本用不到,可以不做了解。 MVC 模式 使用说明 MVC模式可以说是最有名的设计模式之一。它提出将软件的数据模型Model、视图Visual、控制器Controller三者分开封装&#xff0c…

ubuntu设置始终亮屏_ubuntu设置关闭屏幕和锁定

见链接:http://askubuntu.com/questions/177348/how-do-i-disable-the-screensaver-lockIf you want to wrap your app in a script that takes care of this for you when you launch it (or GUI simply isnt an option), the best command-line solution as of Ub…

【转】世上最简单的vue教程

一、需要了解的基本知识 node.js Node.js是一个Javascript运行环境(runtime),发布于2009年5月,由Ryan Dahl开发,实质是对Chrome V8引擎进行了封装。Node.js对一些特殊用例进行优化,提供替代的API,使得V8在非浏览器环境…