当前位置: 首页 > news >正文

什么是设计模式?一文理解,通俗易懂!

前言

最近在学框架的时候,老师总是时不时带两句设计模式,什么工厂模式,单例模式,开发框架用到就提一嘴,但是没有细讲,为了搞懂啥是设计模式,为哈开发框架用到它,我就查找资料,最后,写一篇博客来总结,一下, 通过学习设计模式,对各种开发框架的理解就更加透彻。

设计模式的由来

设计模式的概念最早是由 克里里斯托佛·亚历山大 在其著作 《建筑模式语言》 中首次提出的。 本书介绍了了城市设计的 “语言”,提供了了253个描述城镇、邻里、住宅、花园、房间及西部构造的模式, 而此类“语言” 的基本单元就是模式。后来, 埃里希·伽玛、 约翰·弗利利赛德斯、 拉尔夫·约翰逊 和 理查德·赫尔姆 这四位作者接受了模式的概念。 1994 年, 他们出版了 《设计模式: 可复用面向对象软件的基础》一书, 将设计模式的概念应用到程序开发领域中。

一些老的程序员也许并不了解设计模式的知识,但是同样能写出优秀的代码,主要是他们在不断地项目开发过程中不断积累,提升,优化,总结,最后摸索出来的“规律”,他们总结的规律或他们的开发经验,其实与设计模式提到的内容几乎⼀一致,同样会要求高内聚、低耦合、可扩展、可复用。类似的经历,可以想想在学习一些框架的源码时,发现它里面的某些设计和你在做开发时⼀一样。

设计模式的定义

设计模式是软件开发中一些经过验证的、可重复使用的解决方案,它们帮助程序员解决常见的编程问题。其实在了解了它的来历后,对涉及模式就有一定理解了,顾名思义,就是模式,什么模式,开发设计的模式。

可以把设计模式想象成在烹饪中的食谱:

它提供了一种做菜的方式,虽然你可以想怎么做就怎么做,但使用经典的食谱可以让你更快地做出美味的菜肴。

设计模式遵循的六大原则

  • 单一职责 :一个类和方法只做一件事
  • 里氏替换:多态,子类可扩展父类
  • 依赖倒置:细节依赖抽象,下层依赖上层
  • 接口隔离:建立单一接口
  • 迪米特原则:最少知道,降低耦合
  • 开闭原则:抽象架构,扩展实现

设计模式的分类

为了好理解,我没有细讲模式,这里只讲是设计模式是按什么来分的

创建型模式

创建型模式关注对象的创建过程,旨在将对象的创建与使用分离。主要的创建型模式有:

  • 单例模式(Singleton Pattern):确保一个类只有一个实例,并提供全局访问点。适用于需要唯一实例的场景,例如配置管理器、数据库连接池等。

  • 工厂方法模式(Factory Method Pattern):定义一个创建对象的接口,让子类决定实例化哪一个类。适用于需要创建多种类型对象但不希望具体实现细节暴露的场景。

  • 抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。适用于需要创建多个相关对象的情况,例如图形界面工具中的各种控件。

  • 建造者模式(Builder Pattern):使用多个简单的对象一步步构建一个复杂的对象。适用于需要构建复杂对象的场景,如构建一个复杂的文档或者产品。

  • 原型模式(Prototype Pattern):通过复制现有的对象来创建新对象,而不是通过构造函数。适用于需要复制对象的场景,如对象的克隆和拷贝。

结构型模式

结构型模式关注对象和类的组合,旨在帮助处理对象之间的关系,使其更加灵活。主要的结构型模式有:

  • 适配器模式(Adapter Pattern):将一个类的接口转换成客户端希望的另一个接口。适用于需要兼容旧代码或不同接口的情况,例如在旧系统中引入新的接口。

  • 桥接模式(Bridge Pattern):将抽象部分与实现部分分离,使它们可以独立变化。适用于需要在多个维度上变化的场景,例如图形绘制系统中的形状和颜色。

  • 装饰器模式(Decorator Pattern):动态地给对象添加一些额外的职责。适用于需要在运行时增加功能的场景,如为窗口添加滚动条或边框。

  • 组合模式(Composite Pattern):将对象组合成树形结构以表示“部分-整体”的层次结构。适用于需要处理树形结构的场景,如文件系统中的目录和文件。

  • 享元模式(Flyweight Pattern):通过共享对象来减少内存使用。适用于大量重复对象的场景,如文本编辑器中的字符。

  • 代理模式(Proxy Pattern):为其他对象提供一种代理以控制对该对象的访问。适用于需要控制对象访问的场景,如远程代理和虚拟代理。

行为模式

行为型模式关注对象之间的交互和职责分配,旨在提高对象之间的灵活性和可扩展性。主要的行为型模式有:

  • 观察者模式(Observer Pattern):定义一种一对多的依赖关系,让多个观察者对象同时监听某一主题对象。当主题对象发生变化时,所有依赖于它的观察者都会收到通知。适用于需要实现发布-订阅机制的场景,如事件处理系统。

  • 策略模式(Strategy Pattern):定义一系列算法,将每一个算法封装起来,并使它们可以互换。适用于需要选择不同算法或策略的场景,如支付系统中的支付方式选择。

  • 命令模式(Command Pattern):将请求封装为对象,从而使你能够使用不同的请求、队列请求以及日志请求。适用于需要请求排队或撤销操作的场景,如图形编辑器中的操作历史。

  • 状态模式(State Pattern):允许对象在其内部状态改变时改变其行为。适用于对象行为依赖于其状态的场景,如状态机和工作流管理。

  • 责任链模式(Chain of Responsibility Pattern):将请求沿着处理链传递,直到有对象处理它。适用于需要动态处理请求的场景,如日志处理系统中的日志记录。

  • 备忘录模式(Memento Pattern):在不暴露对象内部结构的情况下,捕获对象的内部状态,以便稍后恢复。适用于需要撤销和恢复操作的场景,如编辑器中的撤销功能。

  • 解释器模式(Interpreter Pattern):为语言定义文法,并提供解释执行的方式。适用于需要处理和解释语言或表达式的场景,如表达式解析器。

  • 迭代器模式(Iterator Pattern):提供一种方法访问一个集合对象中的元素,而无需暴露集合对象的内部表示。适用于需要遍历集合对象的场景,如集合类库中的迭代器。

  • 模板方法模式(Template Method Pattern):定义一个算法的框架,而将一些步骤延迟到子类中。适用于需要固定算法步骤,但允许子类修改某些步骤的场景,如数据处理和文档生成。

  • 访问者模式(Visitor Pattern):允许在不改变对象的前提下定义新的操作。适用于需要对对象结构执行不同操作的场景,如对象的检验和分析。

总结 

看到这应该就更能理解了为什么要有设计模式这么个东西,它的模式和分类也不能说复杂,其实,学习设计模式,跟我说的老程序员一样,是一个“对症下药”的过程,吃“熟练度”的,死学反而效果不好,希望大家能向架构师更进一步(什么?我成架构师了?拜托,你都知道框架怎么设计了好吧~)

相关文章:

什么是设计模式?一文理解,通俗易懂!

前言 最近在学框架的时候,老师总是时不时带两句设计模式,什么工厂模式,单例模式,开发框架用到就提一嘴,但是没有细讲,为了搞懂啥是设计模式,为哈开发框架用到它,我就查找资料&#…...

doxygen制作接口文档

系列文章目录 文章目录 系列文章目录前言一、下载二、安装三、代码注释四、使用doxygen生成文档 前言 每次手动写接口文档太痛苦了,现在福利来了–doxygen Doxygen是软件开发中广泛使用的文档生成器工具。它自动从源代码注释生成文档,解析有关类、函数和…...

PDF怎么在线转Word?介绍四种转换方案

PDF怎么在线转Word?在数字化办公时代,文档的互换性变得尤为重要。PDF格式因其跨平台兼容性和版面固定性而广受欢迎,但有时我们可能需要将PDF文件转换为Word文档,以便进行编辑或进一步处理。以下是四种常见的在线PDF转Word的方法&a…...

大数据应用型产品设计方法及行业案例介绍(可编辑110页PPT)

引言:随着信息技术的飞速发展,大数据已成为推动各行各业创新与变革的重要力量。大数据应用型产品,作为连接海量数据与实际应用需求的桥梁,其设计方法不仅要求深入理解数据特性,还需精准把握用户需求,以实现…...

【Python零基础学习】Python环境安装和IDE选择

文章目录 前言一、Python介绍二、Python下载安装三、IDE选择VS CodePyCharm 四、打印Hello Python World使用cmd使用VS Code 总结 前言 本文是笔者学习Python语言的开篇文章了,Python语法相对比较简单,对编程初学者而言十分友好,应用极其广泛…...

【langchain学习】使用LangChain创建具有上下文感知的问答系统

探讨如何使用LangChain库创建一个上下文感知的问答系统。这个系统能够根据用户的聊天历史,将当前问题转化为一个独立的问题,接着根据上下文提供准确的答案。 1. 导入所需模块 from operator import itemgetter from config import llm # 从config文件…...

原神4.8版本升级计划数据表

原神4.8版本角色数据升级计划表 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>原神4.8版本升级计划…...

海南云亿商务咨询有限公司放大电商品牌影响力

在数字化浪潮席卷全球的今天&#xff0c;电商行业以其独特的魅力和无限潜力&#xff0c;成为了推动经济发展的重要力量。而在这片浩瀚的电商海洋中&#xff0c;抖音电商以其独特的短视频直播模式&#xff0c;迅速崛起为一颗璀璨的新星&#xff0c;引领着新一轮的消费潮流。作为…...

用exceljs和file-saver插件实现纯前端表格导出Excel(支持样式配置,多级表头)

exceljs在Jquery&#xff08;HTML&#xff09;和vue项目中实现导出功能 前言Jquery&#xff08;HTML&#xff09;中实现导出第一步&#xff0c;先在项目本地中导入exceljs和file-saver包第二步&#xff0c;封装导出Excel方法&#xff08;可直接复制粘贴使用&#xff09;第三步&…...

TIA博途_下载时提示密码错误,但是之前并没有设置过密码的解决办法

TIA博途_下载时提示密码错误,但是之前并没有设置过密码的解决办法 如下图所示,下载程序时提示:在线检查保护机密PLC组态数据的密码时出错。 原因: 自 TIA Portal V17 起,新增了安全向导用于帮助客户快速进行安全相关的设置。即保护机密的PLC组态数据功能导致出现下载异常。…...

使用消息队列、rocketMq实现通信

1背景 springboot框架&#xff0c; 2需求 后端需要调用一个类似于api这种作用的小工具&#xff0c;获得工具的返回值&#xff0c;后端再根据客户端的返回值进行更新数据操作 3讨论 1工具开发者使用的是python,将工具封装起来&#xff0c;暴露成web接口供后端调用 2方式一能…...

通过LLM大模型将「白雪公主的故事」转为图数据存储

&#x1f4a1; 本次将使用LLM大模型将「白雪公主的故事」转为图数据存储于neo4j数据库中&#xff0c;并展示图数据部分的效果 故事内容 很久很久以前&#xff0c;在一个遥远的王国里&#xff0c;有一位美丽的**王后**生下了一个皮肤像雪一样白皙、嘴唇像血一样鲜红的**女儿**…...

MyBatisPlus 第一天

数据库创建表 CREATE DATABASE mybatis_plus /*!40100 DEFAULT CHARACTER SET utf8mb4 */; use mybatis_plus; CREATE TABLE user ( id bigint(20) NOT NULL COMMENT 主键ID, name varchar(30) DEFAULT NULL COMMENT 姓名 , age int(11) DEFAULT NULL COMMENT 年龄 , email va…...

线程与多线程(二)

线程与多线程&#xff08;二&#xff09; 一、线程互斥1、相关概念 二、互斥锁1、介绍2、使用场景3、初始化&#xff08;1&#xff09;函数&#xff08;2&#xff09;概念 4、销毁&#xff08;1&#xff09;函数&#xff08;2&#xff09;概念 5、加锁&#xff08;1&#xff09…...

算法板子:欧拉函数——求一个数的欧拉函数、线性时间内求1~n所有数的欧拉函数

目录 1. 欧拉函数 &#xff08;1&#xff09;概念 &#xff08;2&#xff09;性质 &#xff08;3&#xff09;计算公式 2. 求一个数的欧拉函数 &#xff08;1&#xff09;模拟过程 &#xff08;2&#xff09;代码 3. 线性时间内求1~n所有数的欧拉函数——筛法求欧拉函…...

2024牛客暑期多校训练营8

文章目录 A. Haitang and GameE.Haitang and MathJ. Haitang and TriangleK. Haitang and Ava A. Haitang and Game 通过审题可以知道&#xff0c;最后的胜者和若干次操作后最多能增加的数的奇偶有关。 由于 a i a_i ai​ 较小&#xff0c;所以我们枚举每一个没出现过的 x …...

git的一些操作指令

一、git 提交规范 commit message subject &#xff1a; 空格 message 主体 feat: 新功能&#xff08;feature&#xff09;用于提交新功能。fix: 修复 bug用于提交 bug 修复。docs: 文档变更用于提交仅文档相关的修改。style: 代码风格变动&#xff08;不影响代码逻辑&…...

【IT行业研究报告】Internet Technology

一、引言 随着信息技术的飞速发展&#xff0c;IT行业已成为全球经济的重要驱动力。从云计算、大数据、人工智能到物联网&#xff0c;IT技术正深刻改变着各行各业的生产方式、商业模式和人们的生活方式。本报告旨在深入分析IT行业的现状、发展趋势和挑战&#xff0c;探讨其在各…...

GLM大模型的机器翻译能力测试

背景介绍 最近想对GLM-4今年发布的几个大模型 glm-4-0520&#xff0c;glm-4-air以及glm-4-flash简单评测一下它们的机器翻译能力&#xff0c;由于这几个大模型的容量和训练数据都有区别&#xff0c;所以它们的翻译能力也是不同的。我们这里就分别选择一些有趣的&#xff0c;有…...

【硬件产品经理】汽车A样设计

目录 简介 制造方式 作者简介 简介 一般被称作原型样件(Prototype)。 主要是根据系统需求设计,实现基本功能和关键尺寸,用于基本功能的验证,用于初期产品软件调试和Hil台架测试(Hardware in Loop,硬件在环)的样机阶段。 也就说在设计初期,A样的主要目的可以划分…...

[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?

&#x1f9e0; 智能合约中的数据是如何在区块链中保持一致的&#xff1f; 为什么所有区块链节点都能得出相同结果&#xff1f;合约调用这么复杂&#xff0c;状态真能保持一致吗&#xff1f;本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里&#xf…...

Python|GIF 解析与构建(5):手搓截屏和帧率控制

目录 Python&#xff5c;GIF 解析与构建&#xff08;5&#xff09;&#xff1a;手搓截屏和帧率控制 一、引言 二、技术实现&#xff1a;手搓截屏模块 2.1 核心原理 2.2 代码解析&#xff1a;ScreenshotData类 2.2.1 截图函数&#xff1a;capture_screen 三、技术实现&…...

【位运算】消失的两个数字(hard)

消失的两个数字&#xff08;hard&#xff09; 题⽬描述&#xff1a;解法&#xff08;位运算&#xff09;&#xff1a;Java 算法代码&#xff1a;更简便代码 题⽬链接&#xff1a;⾯试题 17.19. 消失的两个数字 题⽬描述&#xff1a; 给定⼀个数组&#xff0c;包含从 1 到 N 所有…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时&#xff0c;与数据库的交互无疑是核心环节。虽然传统的数据库操作方式&#xff08;如直接编写SQL语句与psycopg2交互&#xff09;赋予了我们精细的控制权&#xff0c;但在面对日益复杂的业务逻辑和快速迭代的需求时&#xff0c;这种方式的开发效率和可…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战

在现代战争中&#xff0c;电磁频谱已成为继陆、海、空、天之后的 “第五维战场”&#xff0c;雷达作为电磁频谱领域的关键装备&#xff0c;其干扰与抗干扰能力的较量&#xff0c;直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器&#xff0c;凭借数字射…...

Java线上CPU飙高问题排查全指南

一、引言 在Java应用的线上运行环境中&#xff0c;CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时&#xff0c;通常会导致应用响应缓慢&#xff0c;甚至服务不可用&#xff0c;严重影响用户体验和业务运行。因此&#xff0c;掌握一套科学有效的CPU飙高问题排查方法&…...

JVM 内存结构 详解

内存结构 运行时数据区&#xff1a; Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器&#xff1a; ​ 线程私有&#xff0c;程序控制流的指示器&#xff0c;分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 ​ 每个线程都有一个程序计数…...

push [特殊字符] present

push &#x1f19a; present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中&#xff0c;push 和 present 是两种不同的视图控制器切换方式&#xff0c;它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...

破解路内监管盲区:免布线低位视频桩重塑停车管理新标准

城市路内停车管理常因行道树遮挡、高位设备盲区等问题&#xff0c;导致车牌识别率低、逃费率高&#xff0c;传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法&#xff0c;正成为破局关键。该设备安装于车位侧方0.5-0.7米高度&#xff0c;直接规避树枝遮…...