什么是设计模式?程序员如何学好设计模式?

2023-10-30

前几天,我给大家介绍了算法数据结构的基础知识。后来又有小伙伴私信问我:“小灰,你能不能也讲一讲设计模式的相关知识?”

没问题!对于程序员来说,设计模式也是必须要掌握的一项核心知识,我今天就来给大家重点讲一讲。

编程的痛点

那么,到底什么是设计模式呢?

在介绍这个概念之前,我先问问大家,在你们的工作当中,有没有接手过“祖传代码”?也就是老板让你维护前一任程序员写的老项目。

小灰自己做过10年的程序员,有过很多次这样的经历。这些个祖传代码,有相当一部分压根儿不知道写的是什么,注释非常少,结构也很混乱,不敢修改也不敢删除。

e6709ae3a27ec5136286f48fc2634aae.png

当初写下这些代码的前任,要么已经离职了,根本找不到人来问。

就算他还在职,能找到人,想问对方一点代码的问题,也还得看对方的脸色。

这就是祖传代码的痛苦。

设计模式是什么

我们该怎么办呢?

许多前辈程序员经过长期实践,总结出了一系列的解决方案。这些解决方案可以提高代码的可读性,增加代码的可重用性,保证代码的可扩展性。

这一系列解决方案,被人们称为设计模式,它是面向对象编程当中的各种经典套路。

设计模式是一种抽象的编程思想,并不局限于某一特定的编程语言,而是在许多语言之间相通的。比如在Java、C#、C++语言当中,都可以使用到设计模式。

但设计模式也有它的边界,它的适用范围是面向对象的编程语言。对于面向过程语言、函数式编程语言,谈论设计模式是没有意义的。

如果有人跟你说,Fortran语言当中的设计模式非常好用,或者说自己在学习Lisp语言当中的设计模式,这人一定是一个假程序员。

94d3e872b5455c87ca3a23afb3d5071b.png

设计模式的分类

那么,程序员前辈们一共总结出了多少种设计模式呢?

在1995年,有四位编程界的大佬合著了一本书,书名叫做《Design Patterns: Elements of Reusable Object-Oriented Software》,翻译过来就是《设计模式:可复用面向对象软件的基础》,书里面总共收录了23种设计模式。

这本书是软件研发领域重要的里程碑,合著此书的四位作者,被业内称为GoF(Gang of Four),因此这本书也被人称为GoF设计模式。

这23种设计模式,又可以根据设计的目的,分为大大类型:

第一类:创建型模式

这一类设计模式的目的是用于创建对象。比如大家常用的工厂模式、单例模式,就属于创建型模式。

第二类:结构型模式

这一类设计模式的目的是优化不同类、对象、接口之间的结构关系。比较常用的代理模式、装饰者模式,就属于结构型模式。

第三类:行为型模式

这一类设计模式的目的是更好地实现类与类之间的交互以及算法的执行。比如策略模式、观察者模式,就属于行为型模式。

下面这张图,总结了所有23种设计模式的分类,大家可以收藏一下。

15a10c1dfb057943f3bc77313743f001.png

可能有的人会觉得疑惑:网上有很多程序员总是说到24种设计模式,你这里怎么只说了23种呢?

其实,这两种说法都没错,24种设计模式是在原有23种的基础上,补充了一个空对象模式,它属于行为型模式。

dc6526c7ab9b45754142bd4bc6535937.png

此外,随着编程领域的不断发展,有很多新的设计模式不断被人提出来,目前人们所用到的设计模式其实远远不止24种。

比如生产者消费者模式,发布订阅模式等等,他们都不在24种设计模式当中,但仍然非常常用。

可能有些做后台开发的朋友会问了:我们平时用到的MVC模式,是不是也属于设计模式呢?

082b06da812e6390dd737af3b8345e1d.png

以我个人的观点,设计模式所研究的是类与对象、接口之间的关系,解决的是某一个特定问题。

而MVC,研究的是代码模块之间的关系,并且提供的是一揽子解决方案。所以MVC属于一种架构,而不是设计模式

如何学习设计模

那么,我们怎么才能学好设计模式呢?

就像学习算法和数据结构一样,我们可以通过看书、看网上的视频课程,来了解各种设计模式的思想和实现。

入门级别的书,比较推荐程杰老师的《大话设计模式》

进阶级别的书,推荐看看《Head First 设计模式》这本书。

课程的话,推荐极客时间王争老师的《设计模式之美》,同时在B站上也有一些比较优质的设计模式课程,我会把课程链接发到本视频的置顶回复当中。

与此同时,大家也可以多看看一些经典框架的源码,里面也采用了很多的设计模式。比如Java程序员常用的Spring框架,里面就使用了工厂模式、代理模式、单例模式、适配器模式等等。

b62b95e31473d17acfa330e33d0d9c60.png

这样既能熟悉框架的原理,也能加深对设计模式的理解,可谓是一举两得。

大家都是通过哪些途径学习的设计模式?欢迎写在留言区。

好了,关于设计模式的基本概念,我就给大家介绍到这里。以下是小灰曾经分享过的设计模式相关漫画,没看过的小伙伴可以看一看:

装饰器模式

职责链模式

工厂模式

建造者模式

原型模式

代理模式

外观模式

观察者模式

此外,最近小灰尝试走出舒适区,入驻B站开始录制程序员相关的视频。欢迎大家关注小灰的B站号【我是程序员小灰】,给个一键三连,感谢支持哦~~

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

什么是设计模式?程序员如何学好设计模式? 的相关文章

  • 检查 Android 手机上的方向

    如何查看Android手机是横屏还是竖屏 当前配置用于确定要检索的资源 可从资源中获取Configuration object getResources getConfiguration orientation 您可以通过查看其值来检查方向
  • 将 window.location 传递给 Flask url_for

    我正在使用 python 在我的页面上 当匿名用户转到登录页面时 我想将一个变量传递到后端 以便它指示用户来自哪里 发送 URL 因此 当用户单击此锚链接时 a href Sign in a 我想发送用户当前所在页面的当前 URL
  • 制作java包

    我的 Java 类组织变得有点混乱 所以我要回顾一下我在 Java 学习中跳过的东西 类路径 我无法安静地将心爱的类编译到我为它们创建的包中 这是我的文件夹层次结构 com david Greet java greeter SayHello
  • 使用 AWS Java SDK 为现有 S3 对象设置 Expires 标头

    我正在更新 Amazon S3 存储桶中的现有对象以设置一些元数据 我想设置 HTTPExpires每个对象的标头以更好地处理 HTTP 1 0 客户端 我们正在使用AWS Java SDK http aws amazon com sdkf
  • Java直接内存:在自定义类中使用sun.misc.Cleaner

    在 Java 中 NIO 直接缓冲区分配的内存通过以下方式释放 sun misc Cleaner实例 一些比对象终结更有效的特殊幻像引用 这种清洁器机制是否仅针对直接缓冲区子类硬编码在 JVM 中 或者是否也可以在自定义组件中使用清洁器 例
  • Tomcat 6找不到mysql驱动

    这里有一个类似的问题 但关于类路径 ClassNotFoundException com mysql jdbc Driver https stackoverflow com questions 1585811 classnotfoundex
  • 将 JSON 参数从 java 发布到 sinatra 服务

    我有一个 Android 应用程序发布到我的 sinatra 服务 早些时候 我无法读取 sinatra 服务上的参数 但是 在我将内容类型设置为 x www form urlencoded 之后 我能够看到参数 但不完全是我想要的 我在
  • 如何在matplotlib中调整x轴

    I have a graph like this x轴上的数据表示小时 所以我希望x轴设置为0 24 48 72 而不是现在的值 很难看到 0 100 之间的数据 fig1 plt figure ax fig1 add subplot 11
  • Windows 上的 Nifi 命令

    在我当前的项目中 我一直在Windows操作系统上使用apache nifi 我已经提取了nifi 0 7 0 bin zip文件输入C 现在 当我跑步时 bin run nifi bat as 管理员我在命令行上看到以下消息 但无法运行
  • 从 wxPython 事件处理程序中调用函数

    我正在努力寻找一种在 wxPython 事件处理函数中使用函数的方法 假设我有一个按钮 单击该按钮时 它会使用事件处理程序运行一个名为 OnRun 的函数 但是 用户忘记单击 OnRun 按钮之前的 RadionButton 我想弹出一个
  • 从迭代器外部将 StopIteration 发送到 for 循环

    有几种方法可以打破一些嵌套循环 他们是 1 使用中断 继续 for x in xrange 10 for y in xrange 10 print x y if x y gt 50 break else continue only exec
  • 休眠以持久保存日期

    有没有办法告诉 Hibernate java util Date 应该持久保存 我需要这个来解决 MySQL 中缺少的毫秒分辨率问题 您能想到这种方法有什么缺点吗 您可以自己创建字段long 或者使用自定义的UserType 实施后User
  • 如何使用 enumerate 来倒数?

    letters a b c 假设这是我的清单 在哪里for i letter in enumerate letters 将会 0 a 1 b 2 c 我怎样才能让它向后枚举 如 2 a 1 b 0 c 这是一个很好的解决方案并且工作完美 i
  • python中有没有一种方法可以将存储在列表中的正则表达式模式列表应用到单个字符串?

    我有一个正则表达式模式列表 存储在列表类型中 我想将其应用于字符串 有谁知道一个好方法 将列表中的每个正则表达式模式应用于字符串 和 如果匹配 则调用与列表中该模式关联的不同函数 如果可能的话我想用 python 来做这件事 提前致谢 im
  • 使用 MPI 的 Allreduce 对 Python 对象求和

    我正在使用使用 Python 中的字典和计数器构建的稀疏张量数组操作 我想让并行使用这个数组操作成为可能 最重要的是 我最终在每个节点上都有计数器 我想使用 MPI Allreduce 或另一个不错的解决方案 将其添加在一起 例如 使用计数
  • 为boost python编译的.so找不到模块

    我正在尝试将 C 代码包装到 python 中 只需一个类即可导出两个函数 我编译为map so 当我尝试时import map得到像噪音一样的错误 Traceback most recent call last File
  • 中断连接套接字

    我有一个 GUI 其中包含要连接的服务器列表 如果用户单击服务器 则会连接到该服务器 如果用户单击第二个服务器 它将断开第一个服务器的连接并连接到第二个服务器 每个新连接都在一个新线程中运行 以便程序可以执行其他任务 但是 如果用户在第一个
  • 如何使用 Python/Django 在 Facebook 中获取(和使用)扩展权限

    我正在尝试编写一个简单的应用程序 让用户授予我的代码写入其页面的 Facebook 流的权限 据我了解 它应该很简单 让用户单击一个按钮 启动一个弹出窗口 其中包含我的 Facebook 应用程序中的页面 在该页面中 他们单击授予的内容流发
  • MoviePY 无法在 Windows 上检测 ImageMagick 二进制文件

    我刚买了一台新笔记本电脑 想要设置MoviePY在那新的Windows 64x Python3 7 0 机器 我对所有内容都进行了三次检查 但是当涉及到我的代码的文本部分时 它向我抛出了这个错误 OSError MoviePy Error
  • Biopython 可以执行 Seq.find() 来解释歧义代码吗

    我希望能够在 Seq 对象中搜索考虑歧义代码的子序列 Seq 对象 例如 以下内容应该是正确的 from Bio Seq import Seq from Bio Alphabet IUPAC import IUPACAmbiguousDNA

随机推荐

  • 降维和特征选择的关键方法介绍及MATLAB实现

    目录 概念理解 降维 特征选择 降维的方法 主成分分析 Principle Component Analysis PCA 方法 偏最小二乘法 Partial Least Squares PLS MATLAB实现 重点函数解读 例 光谱数据主
  • 数字货币DCEP

    上周新闻提到了区块链技术 号召大家学习和利用区块链技术 然后数字货币DCEP就浮出了水面 那么这个DCEP是什么呢 我根据自己的经验介绍下 如有不对请指正 DCEP是什么 DCEP是Digital Currency Electronic P
  • 软文营销创造优质内容才能打开市场产生共鸣

    内容是有效软文营销的基石 可满足多种用途 一般企业宣传都会以内容展现在网络上 形式可能包含新闻媒体 自媒体 论坛 问答 视频和其他形式 这些内容形式可以帮助生成 促进你的品牌知名度提升并增加业务收入 内容为王 只有内容优质才能在营销中产生共
  • Java实现区块链 --- 原理篇

    什么是区块链 区块链是由一个个记录着各种信息的小区块链接起来组成的一串链条 和链表类似 是一种数据结构 应用于未来互联化的社会 区块链特性 去中心化 区块链是分布式存储的 不存在中心点 所有每个节点都可以是中心 在生活中像银行 支付宝就属于
  • FFmpeg中编码类型为rawvideo无须解码直接显示测试代码

    在 https blog csdn net fengbingchun article details 93975325 中介绍过通过FFmpeg可以直接获取usb视频流并解码显示的测试代码 当时通过usb获取到的视频流编码类型为AV COD
  • macos 环境下搭建 windbg 虚拟机双机调试环境

    求职 阿哈哈哈广告来了 博主本人 23届落魄web安全 在线求职 本科学历有一段大厂实习 有缺人的大佬么或者有内推的大佬给个机会吧 求求啦 可以微信联系我给您简历 ocean888 文章底下有二维码 本次使用将在 macos 环境下搭建 w
  • flask入门教程(7) - 会话

    会话 flask提供了session对象 即会话 允许你在不同请求之间储存信息 这个对象相当于用密钥签名加密的cookie 即用户可以查看你的cookie 但是如果没有密钥就无法修改它 这是我的网站词神上的cookie 大家可以打开我的网站
  • blender_(uv应用)................http://digitalman.blog.163.com/blog/static/23874605620174172058299/...

    轻松学习Blender基础入门之九 UV 1 2017 06 21 14 24 49 分类 Blender 举报 字号 订阅 下载LOFTER 我的照片书 前言
  • LittleFs文件系统

    小型文件系统 littlefs 简介 LittleFs设计之初的重点特性是 1 低资源消耗 2 掉电保护 3 擦写均衡 本章节重点讨论第 2 和 3 这两个特性 第 1 个特性则贯穿在整个设计过程中 后文把LittleFs简称为lfs 1
  • FaceForensics++数据集下载,FaceForensics++: Learning to Detect Manipulated Facial Images

    FaceForensics 数据集下载 FaceForensics Learning to Detect Manipulated Facial Images 0 前言 如何运行 主要是前三个超参数 不同压缩率所需的空间需求 code 0 前
  • 数据集批量打标——shell脚本批量生成文件并重命名

    shell脚本批量生成文件并重命名 最近接到一个数据集标注的任务 使用的标注工具是LabelImg 使用前配置了环境Anaconda python 3 7 Linux 并在该环境下配置了pyqt5 数据集里的图片是一段视频逐帧抽图 要求在图
  • CCNA学习笔记九 NAT地址转换及优缺点

    网络地址转换 将很多的私网地址转换成公网IP Telnet 快 可以被拦截 ssh ssl加密 安全 改变IP包头 使目的地址 源地址或两个地址在包头中被不同的地址替换 路由器会保存一个转换表 当数据包回来的时候 还原成正确的私网地址 NA
  • LED数码管数字数据集

    LED数码管数字数据集 结合百度OCR取得很好效果 数据集结合百度的OCR百度的OCR https gitee com paddlepaddle PaddleOCR tree release 2 1 程序对应数据集训练进行目标检测识别 数据
  • 在github上托管属于自己的网页

    文章目录 前言 一 配置github 1 建立新的仓库 repository 二 配置git 1 git与github连接 2 测试git与github的连接 3 通过git上传 删除github仓库中的文件 4 网页显示 5 更换域名 总
  • Anaconda安装、源配置、虚拟环境搭建、及Python常用软件安装详解(详细教程)

    首先先介绍一下各种安装软件的基本介绍和常见命令 基本介绍 Anaconda 是可以便捷获取包且对包能够进行管理 同时对环境可以统一管理的发行版本 Anaconda包含了conda Python在内的超过180个科学包及其依赖项 conda是
  • 山东大学软件学院软件项目管理复习

    考前整理的复习题 有一些考试考到了 分享给下一级吧 1 项目目标的制约因素 项目范围 成本 进度计划 客户满意度 三个约束 范围 成本 时间 项目范围是为使客户满意必须做的工作 成本是完成项目所需要的费用 进度计划安排每项任务的起始时间和所
  • pre标签显示服务器端txt文档,区域设计pre显示标签pre

    区域设计pre显示标签pre 内容精选 换一换 在现场讲解汇报 实时监控等场景下 为了获得更好的演示效果 通常需要将态势感知服务的分析结果展示在大型屏幕上 如果只是单纯将控制台界面放大显示 视觉效果并不是很理想 此时可以利用综合大屏 展示专
  • Java并发修改异常ConcurrentModificationException

    import java util ArrayList import java util Iterator import java util ListIterator public class ConcurrentModificationEx
  • A complete log of this run can be found in:

    npm run dev npm ERR code ENOENT npm ERR syscall open npm ERR path C Users Administrator Desktop 项目名 package json npm ERR
  • 什么是设计模式?程序员如何学好设计模式?

    前几天 我给大家介绍了算法和数据结构的基础知识 后来又有小伙伴私信问我 小灰 你能不能也讲一讲设计模式的相关知识 没问题 对于程序员来说 设计模式也是必须要掌握的一项核心知识 我今天就来给大家重点讲一讲 编程的痛点 那么 到底什么是设计模式