什么是设计模式?一文理解,通俗易懂!
前言
最近在学框架的时候,老师总是时不时带两句设计模式,什么工厂模式,单例模式,开发框架用到就提一嘴,但是没有细讲,为了搞懂啥是设计模式,为哈开发框架用到它,我就查找资料,最后,写一篇博客来总结,一下, 通过学习设计模式,对各种开发框架的理解就更加透彻。
设计模式的由来
设计模式的概念最早是由 克里里斯托佛·亚历山大 在其著作 《建筑模式语言》 中首次提出的。 本书介绍了了城市设计的 “语言”,提供了了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样的主要目的可以划分…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...
使用分级同态加密防御梯度泄漏
抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...
iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...
ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...
select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...
AspectJ 在 Android 中的完整使用指南
一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...
Caliper 配置文件解析:fisco-bcos.json
config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...
基于Java+VUE+MariaDB实现(Web)仿小米商城
仿小米商城 环境安装 nodejs maven JDK11 运行 mvn clean install -DskipTestscd adminmvn spring-boot:runcd ../webmvn spring-boot:runcd ../xiaomi-store-admin-vuenpm installnpm run servecd ../xiaomi-store-vuenpm installnpm run serve 注意:运行前…...
Python环境安装与虚拟环境配置详解
本文档旨在为Python开发者提供一站式的环境安装与虚拟环境配置指南,适用于Windows、macOS和Linux系统。无论你是初学者还是有经验的开发者,都能在此找到适合自己的环境搭建方法和常见问题的解决方案。 快速开始 一分钟快速安装与虚拟环境配置 # macOS/…...
