设计模式系列之最终篇:大盘点

news2024/11/27 8:29:09

阅读建议

嗨,伙计!刷到这篇文章咱们就是有缘人,在阅读这篇文章前我有一些建议:

  1. 本篇文章大概4000多字,预计阅读时间长需要3分钟。
  2. 本篇文章的实战性、理论性较强,是一篇质量分数较高的技术干货文章,建议收藏起来,方便时常学习与回顾,温故而知新。
  3. 创作不易,免费的点赞、关注,请走上一走,算是对博主一些鼓励,让我更有动力输出更多的干货内容。

写在前面

        这篇文章是设计模式专栏系列的总结篇,本篇内容主要分为四个部分:

        第一部分:设计模式的专栏的盘点,点击相应的超链接可以跳转到指定的设计模式进行学习,建议收藏 。

        第二部分:设计模式的重点回顾;

        第三部分:设计模式的学习方法;

        第四部分:设计模式如何实战应用;

设计模式系列盘点

        设计模式一般分为三大类:创建型模式、结构型模式、行为型模式。

  • 创建型模式:用于创建对象,共六种,包括单例模式、简单工厂模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式。
  • 结构型模式:用于处理类或对象的组合,共七种,包括适配器模式、装饰者模式、代理模式、门面模式、桥梁模式、组合模式、享元模式。
  • 行为型模式:用于描述类或对象怎样交互以及怎样分配职责,共十一种,包括策略模式、模版方法模式、观察者模式、迭代器模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

设计模式基础篇

设计模式之基础:UML类图怎么看?

设计模式之六大设计原则

创建型设计模式

设计模式之单例模式

设计模式之简单工厂模式

设计模式之工厂方法模式

设计模式之抽象工厂模式

设计模式之建造者模式

设计模式之原型模式

结构型设计 模式

设计模式之适配器模式

设计模式之装饰器模式

设计模式之代理模式

设计模式之门面模式

设计模式之桥梁模式

设计模式之组合模式

设计模式之享元模式

行为型设计模式

设计模式之策略模式

设计模式之模板方法模式

设计模式之观察者模式

设计模式之迭代器模式

设计模式之责任链模式

设计模式之命令模式

设计模式之备忘录模式

设计模式之状态模式

设计模式之访问者模式

设计模式之中介者模式

设计模式之解释器模式

示例源码

凡夫贩夫 / design-pattern-demo · GitCodeGitCode——开源代码托管平台,独立第三方开源社区,Git/Github/Gitlabicon-default.png?t=N7T8https://gitcode.net/fox9916/design-pattern-demo.git

重点回顾

单例模式

确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这种模式常用于需要频繁创建和销毁同一对象的场景,以减少系统开销和资源浪费。

简单工厂模式

基于类的不同条件返回不同类的实例。这种模式主要解决的是创建多个具有相同属性和行为的对象时的问题。

工厂方法模式

定义一个用于创建对象的接口,让子类决定实例化哪一个类。这种模式使得程序在创建对象时不会对外部产生依赖,并且可以实现对具体类实例的解耦。

抽象工厂模式

创建相关或依赖对象的家族,而无需明确指定具体类。这种模式主要用于创建一系列相关或相互依赖的对象,而不需要指定其具体类。

建造者模式

封装构建对象的复杂性,允许其以独立的步骤构建对象。这种模式适用于需要构建复杂对象的场景,通过将构建对象的步骤分解为独立的步骤,使得构建过程更加清晰和灵活。

原型模式

通过复制现有的实例来创建新的实例。这种模式常用于需要大量重复对象的场景,通过复制已有的实例来减少创建新对象的时间和资源开销。

适配器模式

将一个类的接口转换成客户希望的另外一个接口。这种模式主要用于解决两个接口不兼容的问题,使得原本无法协同工作的类可以协同工作。

装饰器模式

动态地给对象添加新的功能。这种模式通过动态地创建一个包含原始对象的新对象,并在新对象中添加新的功能,从而实现了一种灵活且可扩展的对象结构。

代理模式

为其他对象提供一个代理以控制对这个对象的访问。这种模式通过创建一个代理对象来控制对原始对象的访问,从而实现对原始对象的保护和对访问过程的控制。

门面模式

提供统一的方法来访问子系统的一群接口。这种模式通过对外提供一个统一的接口,使得客户端可以方便地访问子系统中的一组接口,从而简化客户端的代码复杂度。

桥梁模式

将抽象部分与它的实现部分分离,使它们都可以独立地变化。这种模式通过将抽象和实现部分分离,使得抽象和实现可以独立地变化和扩展,从而提高了系统的灵活性和可维护性。

组合模式

将对象组合成树形结构以表示“部分-整体”的层次结构。这种模式使得客户端代码可以统一地处理单个对象和组合对象,从而提高代码的复用性和可维护性。

享元模式

运用共享技术有效地支持大量细粒度的对象。这种模式主要用于解决大量相似对象的创建和销毁问题,通过共享对象来减少系统开销和资源浪费。

策略模式

定义一系列算法,把它们一个个封装起来,并且使它们可互相替换。这种模式主要用于处理一系列可互换的算法或策略,使得客户端可以根据实际情况选择合适的策略进行使用。

模板方法模式

定义一个操作中的算法骨架,将某些步骤延迟到子类中实现。这种模式主要用于定义一个操作的算法骨架,并将某些步骤延迟到子类中实现,从而提高代码的复用性和灵活性。

观察者模式

定义对象之间的依赖关系,当一个对象改变状态时则自动通知其依赖者。这种模式主要用于建立对象之间的依赖关系,使得当一个对象的状态发生改变时能够自动通知其依赖者。

迭代器模式

提供一种方法来顺序访问聚合对象的各个元素,而不暴露其底层表示。这种模式主要用于遍历聚合对象的各个元素,而不暴露其底层表示,从而提高代码的封装性和安全性。

命令模式

将请求或操作封装成一个对象,从而允许将客户端和接收者解耦。这种模式主要用于将请求或操作封装成一个对象,从而解耦客户端和接收者之间的关系,提高系统的可维护性和可扩展性。

责任链模式

将请求沿着链传递给下一个接收者,直到找到处理该请求的接收者为止。这种模式主要用于处理一系列处理请求的接收者,通过将请求沿着链传递给下一个接收者,直到找到处理该请求的接收者为止,从而提高系统的可扩展性和灵活性。

备忘录模式

保存一个对象的内部状态并将其恢复到先前的状态。这种模式主要用于保存和恢复对象的内部状态,使得对象可以在必要时恢复到先前的状态。

状态模式

状态模式的核心是将一个对象的状态改变为它的子类,根据它的状态来改变其行为。这种模式可以帮助一个对象在其状态改变时改变其行为,使得程序逻辑更清晰,更容易维护和扩展。

访问者模式

访问者模式的核心是将操作逻辑从数据结构中分离出来,通过访问者对象来操作数据结构中的元素。这种模式可以减少对数据结构的修改,提高代码的可重用性和可维护性。

中介者模式

中介者模式的核心是定义一个中介者对象,将多个对象之间的通信解耦,使它们之间保持松散耦合。这种模式可以减少对象之间的依赖,提高代码的可维护性和可扩展性。

解释器模式

解释器模式的核心是定义一个解释器对象,用于解释和执行一种特定语言的语法规则。这种模式可以简化对复杂语法的处理,提高代码的可读性和可维护性。

学习方法

        软件工程中的设计模式,本身就是一种方法论,想学习好并掌握它,更需要一定的方法和技巧:

  • 理论学习:首先,可以通过阅读相关的书籍和技术博客,了解设计模式的基本概念、分类、应用场景等理论知识。强烈向小伙伴推荐我的技术博客中的《设计模式专栏》,它详细介绍了梳理种常见的设计模式的概念及其原理、应用和实现方法。
  • 掌握基础语言知识:设计模式的学习需要具备一定的编程基础,如果是Java程序员,面向对象编程(OOP)的基础知识,如类、对象、继承、多态等是必须要掌握的,因此我的《设计模式专栏》的第一篇就是和大家分享如何通过UML类图来看清楚,类与类之间的关系。
  • 实践项目:理论学习是基础,但只有通过实践才能真正掌握设计模式。可以选择一些小型的项目或者案例,尝试使用设计模式来解决实际问题。例如,可以使用工厂模式来管理对象的创建,用观察者模式实现事件驱动的系统等。通过实践,可以加深对设计模式的理解和掌握,需要特别注意的是在实际业务场景应用中,有可能不会完全符合某个设计模式的定义,也有可能在某个业务场景中,需要某两种及以上设计模式结合起来使用。
  • 参与社区和论坛:参与社区和论坛的讨论,了解其他开发者是如何应用设计模式的,同时也可以分享自己的经验和问题。
  • 反思和总结:在学习过程中,要不断反思和总结,思考每种设计模式的应用场景、优缺点以及与其他模式的区别和联系。同时,也要反思自己在使用设计模式的过程中出现的错误和不足,并加以改进。
  • 持续学习和更新知识:设计模式的发展是随着软件工程的发展而不断演进的,因此需要持续学习和更新知识。关注最新的技术趋势和最佳实践,了解新的设计模式和解决方案,以保持自己的竞争力。

        总之,软件工程中的设计模式的学习需要理论和实践相结合,不断反思和总结,同时保持持续学习和更新知识。只有这样,才能不断提高自己的软件设计和开发能力。

实战应用

要将设计模式应用到具体的业务场景中,可以按照以下步骤进行:

  1. 分析业务需求和问题:首先需要了解业务的需求和问题,包括业务流程、数据结构、用户界面等方面。分析业务需求和问题可以帮助你了解问题的本质和需求,为选择合适的设计模式打下基础。
  2. 选择合适的设计模式:根据业务需求和问题,选择合适的设计模式来解决特定的问题。在设计模式的选择上,需要考虑设计模式的意图、适用性、可扩展性等方面。同时,还需要考虑设计模式的应用范围,例如单例模式适用于全局唯一的对象,工厂模式适用于创建对象的逻辑封装等。
  3. 抽象和泛化:将业务需求和问题抽象为一般性的解决方案,并能够将该方案应用到类似的问题中。抽象和泛化可以帮助你更好地理解和应用设计模式,提高代码的可维护性和可扩展性。
  4. 实现设计模式:根据选择的设计模式和抽象的解决方案,实现相应的代码。在实现设计模式时,需要注意代码的可读性、可维护性和性能等方面的问题。
  5. 测试和调试:完成设计模式的实现后,需要进行测试和调试。测试主要包括单元测试、集成测试和系统测试等,确保代码的正确性和稳定性。同时,在调试过程中需要注意代码的逻辑、性能和异常处理等方面的问题。
  6. 优化和改进:根据测试结果和实际使用情况,对代码进行优化和改进。优化主要包括代码重构、性能优化等方面,改进则包括对代码的可读性、可维护性和可扩展性等方面的改进。
  7. 总结和反思:在设计模式应用过程中,需要不断总结和反思。总结成功的经验和失败的教训,反思代码的设计和实现过程,以便更好地应用设计模式来解决实际问题。

        总之,将设计模式应用到具体的业务场景中需要具备一定的抽象和泛化能力,同时需要注意理解业务需求和问题、选择合适的设计模式、实现细节的正确性、进行测试和验证以及不断优化和完善等方面的问题。在实际应用中,需要结合具体的问题和需求来进行综合考虑,选择合适的设计模式来解决特定的问题。

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

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

相关文章

NVMe 2.0 简介

随着全新一代PCIe 5.0 SSD的发布,新的NVMe 2.0规范协议也是如期而至。作为PCIe SSD最为重要的底层协议,NVMe 2.0都有哪些重要调整?又有哪些值得我们关注的新功能?本文简单解答。 NVMe 演化史 NVMe自诞生以来,其关注的…

Blazor 附件上传和下载功能

效果图 page "/uploadFile" inject Microsoft.AspNetCore.Hosting.IWebHostEnvironment WebHostEnvironment inject ToastService ToastService inject DownloadService DownloadService<h3>UploadFile</h3><Button OnClick"ButtonClick" C…

cmd窗口中文乱码

问题&#xff1a;今天电脑重装了&#xff0c;跑程序的时候&#xff0c;cmd窗口汉字出现乱码&#xff0c;看起来很不舒服 解决方案&#xff1a;在注册表中修改cmd的属性设置&#xff0c;实现一次修改永远有效 1. 打开 winR 输入 regedit 进入注册表 2. 找到 HKEY_CURRENT_USER…

AWTK实现汽车仪表Cluster/DashBoard嵌入式GUI开发(六):FREERTOS移植

前言: 一般的GUI工程都需要一个操作系统,可能是linux,重量级的,也可能是FreeRTOS,轻量级的。 一句话理解那就是工程就是FreeRTOS task任务的集合。 一个main函数可以看到大框架: 很显然,除了第一个是硬件配置的初始化,中间最重要的部分就是要创建任务。而一个任务主…

STM32H750之FreeRTOS学习--------(六)FreeRTOS的列表和列表项

六、FreeRTOS的列表和列表项 文章目录 六、FreeRTOS的列表和列表项列表相关结构体列表项相关结构体迷你列表项列表相关API函数介绍初始化列表vListInitialise()函数vListInitialiseItem()函数vListInsert()函数 vListInsertEnd()函数 uxListRemove() 列表就是一个双向链表&…

RT-DETR算法优化改进:Backbone改进 | LSKNet:遥感旋转目标检测新SOTA | ICCV 2023

💡💡💡本文独家改进:LSKNet 助力RT-DETR ,替换backbone,Large Selective Kernel Network (LSKNet),可以动态地调整其大空间感受野,以更好地建模遥感场景中各种物体的测距的场景。 推荐指数:五星 RT-DETR魔术师专栏介绍: https://blog.csdn.net/m0_63774211/cat…

Windows装机必装软件|每款都好用到起飞!

1.GeekUninstaller&#xff1a;这款软件是一款功能强大的卸载工具&#xff0c;可以完全删除无用的程序和插件&#xff0c;并清理与之相关的文件夹。它没有广告或捆绑软件&#xff0c;非常干净。 2.PotPlayer&#xff1a;作为一款纯粹的播放器&#xff0c;PotPlayer可以流畅播放…

【数据结构】面试OJ题——带环链表(数学推论)

目录 1.环形链表Ⅰ ​编辑 思路 &#xff1a; 思路拓展 问题一&#xff1a; 问题二&#xff1a; 总结&#xff1a; 问题三&#xff1a; 证明总结第三点 总结&#xff1a; 2. 环形链表Ⅱ 思路一 思路二 3.相交链表 思路&#xff1a; 1.环形链表Ⅰ 141. 环形链…

ebSocket connection to ‘wss://xxx.xxxxxxx.xxx/‘ failed:

目录 1&#xff1a;网络连接问题&#xff1a;检查您是否已连接到互联网&#xff0c;您的网络是否稳定。您还可以尝试重置您的Internet连接或切换到另一个网络。 排除方法&#xff1a;直接打开个网址就知道了&#xff0c;这应该不用教了吧 2&#xff1a;防火墙或代理设置&…

桌面便签软件用哪个?10款全球好用的便签软件推荐,告别杂论无章!

在如今的快节奏社会中&#xff0c;我们的生活和工作节奏越来越快&#xff0c;每天面对的信息成倍地增长。有时候&#xff0c;我们需要随手记下一些重要的事情&#xff0c;或者是一些突然的灵感&#xff0c;这时候就需要一款好用的桌面便签软件。 桌面便签软件可以帮助我们更好…

【机器学习5】无监督学习聚类

相比于监督学习&#xff0c; 非监督学习的输入数据没有标签信息&#xff0c; 需要通过算法模型来挖掘数据内在的结构和模式。 非监督学习主要包含两大类学习方法&#xff1a; 数据聚类和特征变量关联。 1 K均值聚类及优化及改进模型 1.1 K-means 聚类是在事先并不知道任何样…

为什么说美味、珍贵的高贵甜酒是“来自大自然的礼物”?

当德国葡萄酒产区的主要葡萄收获季节成功结束时&#xff0c;人们可以观察到在某些地区个别葡萄园还没有收获。它们没有被酿酒师遗忘&#xff0c;而是在等待成为高贵甜美的佳肴。在秋天的好天气里&#xff0c;葡萄继续生长&#xff0c;每天自然都会增加它们的甜度。来自云仓酒庄…

负公差轧钢测径仪 多规格可定制 普通智能随意选择

负公差轧制的意义&#xff1a; 轧钢厂生产的螺纹钢是按理论重量销&#xff0c;因此稳定的高负差产品极具市场竞争力。负差率即实际重量与理论重量的差值&#xff0c;除以理论重量&#xff0c;乘100%。以螺纹12为例&#xff0c;不按负差生产&#xff0c;在坯重2450kg的情况下&am…

React Hooks实战:Web开发与设计

目录 前言 一、React Hooks 简介 二、React Hooks 的基本用法 1. 使用 useState 创建状态 2. 使用 useEffect 添加副作用 3. 使用 useContext 获取上下文 三、React Hooks 的常见问题 1. 循环引用问题 2. 副作用问题 四、React Hooks 实战案例 1. 使用 useState钩子…

竞赛选题 深度学习的智能中文对话问答机器人

文章目录 0 简介1 项目架构2 项目的主要过程2.1 数据清洗、预处理2.2 分桶2.3 训练 3 项目的整体结构4 重要的API4.1 LSTM cells部分&#xff1a;4.2 损失函数&#xff1a;4.3 搭建seq2seq框架&#xff1a;4.4 测试部分&#xff1a;4.5 评价NLP测试效果&#xff1a;4.6 梯度截断…

thinkphp 自定义错误页面

在访问无效的UI 这个效果不好&#xff0c;要改成自定义的 <?php namespace app\controller;class ErrorController {public function __call($method,$args){return error request!;} }之后就是提示

【第2章 Docker容器基础入门】 课程介绍 + docker容器介绍

一、课程介绍 1.1、容器运行时 1.2、官网 1.3、私有镜像 二、什么是 Docker &#xff1f; 2.1 Docker 的思想来自于集装箱&#xff0c;集装箱解决了什么问题&#xff1f; 2.2 、K8S 1.25版本之后可能废弃docker&#xff0c;为什么还需要学习docker&#xff1f; 一、课程介…

Docker学习——⑧

文章目录 1、什么是 Docker Compose(容器编排)2、为什么要 Docker Compose&#xff1f;3、Docker Compose 的安装4、Docker Compose 的功能和使用场景5、Docker Compose 文件&#xff08;docker-compose.yml&#xff09;5.1 文件语法版本5.2 文件基本结构及常见指令 6、Docker …

Postgresql数据类型-数据类型转换

PostgreSQL数据类型转换主要有三种方式&#xff1a;通过格式化函数、CAST函数、::操作符&#xff0c;下面分别介绍。 通过格式化函数进行转换 PostgreSQL提供一系列函数用于数据类型转换&#xff0c;如表所示。 通过CAST函数进行转换将varchar字符类型转换成text类型&#xf…

【excel技巧】如何取消excel隐藏?

Excel工作表中的行列隐藏了数据&#xff0c;如何取消隐藏行列呢&#xff1f;今天分享几个方法给大家 方法一&#xff1a; 选中隐藏的区域&#xff0c;点击右键&#xff0c;选择【取消隐藏】就可以了 方法二&#xff1a; 如果工作表中有多个地方有隐藏的话&#xff0c;还是建…