设计模式(二)设计模式的本质

简介

设计模式是计算机前辈们,总结项目开发成败经验,得出的一套最佳实践理论。它并不是高高在上、不切实际的理论,而是具体到代码编写层面的指导理论。

从学习编写代码开始,我们就被教导,要写高内聚、低耦合、可复用、可扩展的代码。但是具体要怎么做呢?设计模式给出了答案。所以,我们之所以要学习设计模式,是因为它可以教会我们,如何实现代码的高内聚、低耦合、可复用,从而提高项目的可维护性,降低项目失败风险,提高项目质量。正因如此,设计模式是每个开发人员的必修课。

理解

但是,我们在学习设计模式的时候,常常因为没有抓住设计模式的本质,而迷失于设计模式的丛林中。只有紧紧抓住设计模式的本质,从而更加省时省力地将其掌握,才能更深入理解其内涵,并且知道什么时候该用、什么时候不该用、具体应该用哪个设计模式。如果无法分析如何使用设计模式、使用设计模式会付出哪些成本、带来什么影响,这将会给项目带来更多的风险和麻烦。也就是说,如非必要,不要使用设计模式;如果用,就要用对。

网络上的一些自称通俗易懂讲解设计模式的文章,其实看下来,并没有让我们理解设计模式的本质。

笔者认为,本质这种东西用一两句话就应该可以描述出来,并且能描绘出被研究对象共同的特征。

本质

回归正题,设计模式的本质是什么?用一句话概括,设计模式的本质就是教你怎么封装。

想象一下这样一个过程。你不用设计模式,实现了某个功能,软件正常运行,一切正常。
但是为了提高代码的质量,你准备重构现有的代码。
通过分析发现,某些代码段的使用频率很高,我们可以将其称作“热代码”。对于热代码,我们不想一遍一遍的敲,想要节省时间和精力。实现这个目的的方法就是把热代码封装起来。

只有通过适当的封装,才能实现代码的高内聚、低耦合、可复用、可扩展。所以,设计模式的本质就是教你怎么封装。当然,封装的目的多种多样,可能有时并不只是为了封装热代码,实际工作中,要根据问题的优先级综合考虑。

理性对待

设计模式不是万能的,不要迷信设计模式。需求的变化是常事,所有已有的代码都可能被推翻。巨大的需求变化下,设计模式也无能为力。设计模式只能适应某类需求变化,而不是所有需求的变化。在使用设计模式时,需要开发团队根据经验和理论对需求的进行预测,选择合适的设计模式,提高项目维护性。

设计模式既然是一种好的做法,那么对应的,就有不好的做法。这也从侧面说明了,不学设计模式也一样能够实现想要的功能。功能才是软件的生命,功能才是用户真正关心的东西,设计模式只是开发人员的思维工具。

后面的文章中,笔者将对各种已有的设计模式,从设计模式的本质出发,进行细致分解。

设计模式的参考资料我们采用国内目前比较便于访问的菜鸟教程中的内容。地址:https://www.runoob.com/design-pattern/design-pattern-intro.html


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

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

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

相关文章

angular设置referer_Angular-cli 构建应用的一些配置

Angular-cli 构建应用的一些配置标签(空格分隔): Angular直接使用 ng build --prod --build-optimizer --base-href/ 来发布base-href可以设置服务器上的某个子路径,使用 ng build --base-href/my/path/如果打包静态文件(js和css)不放在和index.html同一…

设计模式(三)创建型模式

前言 根据菜鸟教程的目录,我们首先来看看创建型模式。 创建型模式研究: 实际应用中通常有哪些不同的创建对象的场景;在不同的场景下,如何更好地编写创建对象的代码。主要研究构造函数。 下面分别对创建型模式下的各种具体模式进…

CSDN改版,找不到各种入口,链接放下面

https://mp.csdn.net/console/article?spm1010.2135.3001.5128 https://mp.csdn.net/console/column/allColumnList 分类管理 https://mp.csdn.net/console/article 文章管理 https://mp.csdn.net/console/upDetailed 资源管理 https://mp.csdn.net/editor/html?spm1011.…

python中pca算法_python实现PCA算法01

python实现PCA算法Software version: Python 2.7.12 |Anaconda 4.2.0 (64-bit)|法1. 编程一步一步实现法2. sklearn我们以定义函数的形式来一步一步进行1.1 导入模块:Numpy,Pandas# -*- coding: utf-8 -*-# Time : 2017/8/17 14:20# Author :…

设计模式(一)预备知识

前言 学习设计模式需要有面向对象编程的基础,要基本掌握一种面向对象的编程语言。关于面向对象编程思想,我们有另外一篇文章专门讲解:面向过程和面向对象的联系和区别。 知识点 虚函数 在类的成员函数定义中,形式上为定义为vir…

【转】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 来部署应用? 方便管理; 较为常见的部署方式; 可配置性较…

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

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