什么是设计模式?一文理解,通俗易懂!
前言
最近在学框架的时候,老师总是时不时带两句设计模式,什么工厂模式,单例模式,开发框架用到就提一嘴,但是没有细讲,为了搞懂啥是设计模式,为哈开发框架用到它,我就查找资料,最后,写一篇博客来总结,一下, 通过学习设计模式,对各种开发框架的理解就更加透彻。
设计模式的由来
设计模式的概念最早是由 克里里斯托佛·亚历山大 在其著作 《建筑模式语言》 中首次提出的。 本书介绍了了城市设计的 “语言”,提供了了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版本升级计划…...

海南云亿商务咨询有限公司放大电商品牌影响力
在数字化浪潮席卷全球的今天,电商行业以其独特的魅力和无限潜力,成为了推动经济发展的重要力量。而在这片浩瀚的电商海洋中,抖音电商以其独特的短视频直播模式,迅速崛起为一颗璀璨的新星,引领着新一轮的消费潮流。作为…...

用exceljs和file-saver插件实现纯前端表格导出Excel(支持样式配置,多级表头)
exceljs在Jquery(HTML)和vue项目中实现导出功能 前言Jquery(HTML)中实现导出第一步,先在项目本地中导入exceljs和file-saver包第二步,封装导出Excel方法(可直接复制粘贴使用)第三步&…...

TIA博途_下载时提示密码错误,但是之前并没有设置过密码的解决办法
TIA博途_下载时提示密码错误,但是之前并没有设置过密码的解决办法 如下图所示,下载程序时提示:在线检查保护机密PLC组态数据的密码时出错。 原因: 自 TIA Portal V17 起,新增了安全向导用于帮助客户快速进行安全相关的设置。即保护机密的PLC组态数据功能导致出现下载异常。…...
使用消息队列、rocketMq实现通信
1背景 springboot框架, 2需求 后端需要调用一个类似于api这种作用的小工具,获得工具的返回值,后端再根据客户端的返回值进行更新数据操作 3讨论 1工具开发者使用的是python,将工具封装起来,暴露成web接口供后端调用 2方式一能…...

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

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…...

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

算法板子:欧拉函数——求一个数的欧拉函数、线性时间内求1~n所有数的欧拉函数
目录 1. 欧拉函数 (1)概念 (2)性质 (3)计算公式 2. 求一个数的欧拉函数 (1)模拟过程 (2)代码 3. 线性时间内求1~n所有数的欧拉函数——筛法求欧拉函…...
2024牛客暑期多校训练营8
文章目录 A. Haitang and GameE.Haitang and MathJ. Haitang and TriangleK. Haitang and Ava A. Haitang and Game 通过审题可以知道,最后的胜者和若干次操作后最多能增加的数的奇偶有关。 由于 a i a_i ai 较小,所以我们枚举每一个没出现过的 x …...
git的一些操作指令
一、git 提交规范 commit message subject : 空格 message 主体 feat: 新功能(feature)用于提交新功能。fix: 修复 bug用于提交 bug 修复。docs: 文档变更用于提交仅文档相关的修改。style: 代码风格变动(不影响代码逻辑&…...

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

GLM大模型的机器翻译能力测试
背景介绍 最近想对GLM-4今年发布的几个大模型 glm-4-0520,glm-4-air以及glm-4-flash简单评测一下它们的机器翻译能力,由于这几个大模型的容量和训练数据都有区别,所以它们的翻译能力也是不同的。我们这里就分别选择一些有趣的,有…...
【硬件产品经理】汽车A样设计
目录 简介 制造方式 作者简介 简介 一般被称作原型样件(Prototype)。 主要是根据系统需求设计,实现基本功能和关键尺寸,用于基本功能的验证,用于初期产品软件调试和Hil台架测试(Hardware in Loop,硬件在环)的样机阶段。 也就说在设计初期,A样的主要目的可以划分…...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...

基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

C++:多态机制详解
目录 一. 多态的概念 1.静态多态(编译时多态) 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1).协变 2).析构函数的重写 5.override 和 final关键字 1&#…...
探索Selenium:自动化测试的神奇钥匙
目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...

c++第七天 继承与派生2
这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分:派生类构造函数与析构函数 当创建一个派生类对象时,基类成员是如何初始化的? 1.当派生类对象创建的时候,基类成员的初始化顺序 …...
【安全篇】金刚不坏之身:整合 Spring Security + JWT 实现无状态认证与授权
摘要 本文是《Spring Boot 实战派》系列的第四篇。我们将直面所有 Web 应用都无法回避的核心问题:安全。文章将详细阐述认证(Authentication) 与授权(Authorization的核心概念,对比传统 Session-Cookie 与现代 JWT(JS…...

Linux 下 DMA 内存映射浅析
序 系统 I/O 设备驱动程序通常调用其特定子系统的接口为 DMA 分配内存,但最终会调到 DMA 子系统的dma_alloc_coherent()/dma_alloc_attrs() 等接口。 关于 dma_alloc_coherent 接口详细的代码讲解、调用流程,可以参考这篇文章,我觉得写的非常…...