当前位置: 首页 > 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样的主要目的可以划分…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

ubuntu搭建nfs服务centos挂载访问

在Ubuntu上设置NFS服务器 在Ubuntu上&#xff0c;你可以使用apt包管理器来安装NFS服务器。打开终端并运行&#xff1a; sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享&#xff0c;例如/shared&#xff1a; sudo mkdir /shared sud…...

UE5 学习系列(三)创建和移动物体

这篇博客是该系列的第三篇&#xff0c;是在之前两篇博客的基础上展开&#xff0c;主要介绍如何在操作界面中创建和拖动物体&#xff0c;这篇博客跟随的视频链接如下&#xff1a; B 站视频&#xff1a;s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

在四层代理中还原真实客户端ngx_stream_realip_module

一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡&#xff08;如 HAProxy、AWS NLB、阿里 SLB&#xff09;发起上游连接时&#xff0c;将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后&#xff0c;ngx_stream_realip_module 从中提取原始信息…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来&#xff0c;实在找不到&#xff0c;希望有大佬教一下我。 还有就会议时间&#xff0c;我感觉不是图片时间&#xff0c;因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天&#xff0c;Spring AI 作为 Spring 生态系统的新生力量&#xff0c;正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务&#xff08;如 OpenAI、Anthropic&#xff09;的无缝对接&…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

JDK 17 新特性

#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持&#xff0c;不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的&#xff…...

根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:

根据万维钢精英日课6的内容&#xff0c;使用AI&#xff08;2025&#xff09;可以参考以下方法&#xff1a; 四个洞见 模型已经比人聪明&#xff1a;以ChatGPT o3为代表的AI非常强大&#xff0c;能运用高级理论解释道理、引用最新学术论文&#xff0c;生成对顶尖科学家都有用的…...