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

设计模式全解(含代码实例)

目录

  • 设计模式概念
    • 耦合与解耦
  • 常见-5种
  • 全部-23种
    • 创建型模式(Creational Patterns)
      • ==单例模式==(Singleton Pattern)
      • ==工厂方法模式==(Factory Method Pattern):
      • 抽象工厂模式(Abstract Factory Pattern):
      • 建造者模式(Builder Pattern):
      • 原型模式(Prototype Pattern):
    • 结构型模式(Structural Patterns)
      • 适配器模式(Adapter Pattern):
      • 桥接模式(Bridge Pattern):
      • 组合模式(Composite Pattern):
      • ==装饰器模式==(Decorator Pattern):
      • 外观模式(Facade Pattern):
      • 享元模式(Flyweight Pattern):
      • 代理模式(Proxy Pattern):
    • 行为型模式(Behavioral Patterns)
      • 责任链模式(Chain of Responsibility Pattern):
      • 命令模式(Command Pattern):
      • 解释器模式(Interpreter Pattern):
      • 迭代器模式(Iterator Pattern):
      • 中介者模式(Mediator Pattern):
      • 备忘录模式(Memento Pattern):
      • ==观察者模式==(Observer Pattern):
      • 状态模式(State Pattern):
      • ==策略模式==(Strategy Pattern):
      • 模板方法模式(Template Method Pattern):
      • 访问者模式(Visitor Pattern):

设计模式概念

设计模式(Design Pattern)是经过反复验证的、用于解决软件设计中常见问题的通用解决方案。它们并不是直接可以复制的代码,而是一些解决问题的思路和方法。设计模式主要目标是提高软件的可重用性、可维护性、扩展性和解耦性。
设计模式的核心思想是总结和提炼软件开发中的最佳实践,帮助开发人员在面对具体问题时能够避免重复造轮子。

耦合与解耦

耦合是指两个或两个以上的体系或两种运动形式间通过相互作用而彼此影响以至联合起来的现象。在软件工程中,对象之间的耦合度就是对象之间的依赖性。对象之间的耦合越高,维护成本越高,因此对象的设计应使类和构件之间的耦合最小。
解耦,字面意思就是解除耦合关系。让数据模型,业务逻辑和视图显示三层之间彼此降低耦合,把关联依赖降到最低,而不至于牵一发而动全身。原则就是A功能的代码不要写在B的功能代码中,如果两者之间需要交互,可以通过接口,通过消息,甚至可以引入框架,但总之就是不要直接交叉写。
代表:观察者模式,观察者模式存在的意义就是「解耦」,它使观察者和被观察者的逻辑不再搅在一起,而是彼此独立、互不依赖。比如网易新闻的夜间模式,当用户切换成夜间模式之后,被观察者会通知所有的观察者「设置改变了,大家快蒙上遮罩吧」。QQ消息推送来了之后,既要在通知栏上弹个推送,又要在桌面上标个小红点,也是观察者与被观察者的巧妙配合。

常见-5种

最常见的设计模式:单例模式、工厂方法模式、观察者模式、策略模式和装饰器模式。

全部-23种

总体来说设计模式分为三大类:
创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

创建型模式(Creational Patterns)

主要处理对象的创建问题,确保对象创建过程的灵活性,提供一些通用的方式来创建对象。

单例模式(Singleton Pattern)

确保类只有一个实例,并提供全局访问点。
适用于控制某些资源(如数据库连接、日志管理等)的共享。
应用场景表现在:全局状态管理(如Redux中的Store)。数据库连接池。日志记录器。
在这里插入图片描述

工厂方法模式(Factory Method Pattern):

定义一个创建对象的接口,让子类决定实例化哪个类。
适用于需要创建不同类型的对象,但不希望直接使用 new 来实例化时。
在这里插入图片描述

抽象工厂模式(Abstract Factory Pattern):

提供一个接口,用于创建一系列相关或相互依赖的对象,而无需指定它们具体的类。常用于跨平台的 UI 库等。

建造者模式(Builder Pattern):

使用多个简单的对象一步步构建成一个复杂的对象。
适用于对象构建过程非常复杂或者有多个可选项的情况。

原型模式(Prototype Pattern):

通过复制现有的对象来创建新的对象,而不是通过构造函数来实例化。
适用于创建成本较高或需要大量相似对象的情况。

结构型模式(Structural Patterns)

关注如何将类和对象组合成更大的结构,保证结构的灵活性和效率。

适配器模式(Adapter Pattern):

将一个类的接口转换成客户端期望的另一种接口,使原本由于接口不兼容而不能一起工作的类可以一起工作。
适用于需要将现有类库或系统与其他接口兼容时。
一般应用场景表现在:兼容旧代码。集成第三方库。
在这里插入图片描述

桥接模式(Bridge Pattern):

将抽象部分与实现部分分离,使得两者可以独立变化。
适用于希望将抽象层和实现层解耦的场景。

组合模式(Composite Pattern):

将对象组合成树形结构以表示“部分-整体”的层次结构。
适用于需要处理树形结构数据的场景,如文件系统。

装饰器模式(Decorator Pattern):

动态地给一个对象添加额外的职责,不影响其他对象。
适用于增强或改变对象功能,但不希望改变原有对象的情况。
一般应用场景表现在:扩展对象功能(如添加日志、缓存)。动态添加属性或方法。
在这里插入图片描述

外观模式(Facade Pattern):

提供一个统一的接口,用来访问子系统中的一组接口,简化客户端与子系统的交互。
适用于复杂系统的简化接口层设计。

享元模式(Flyweight Pattern):

通过共享对象来减少内存使用,尤其是大量相似的对象。
适用于内存密集型的系统,特别是在大量相似对象存在时。

代理模式(Proxy Pattern):

为其他对象提供代理,以控制对该对象的访问。
适用于需要控制访问的场景,如虚拟代理、保护代理等。
一般应用场景表现在:延迟加载(如图片懒加载)。访问控制(如权限验证)。缓存代理。
在这里插入图片描述

行为型模式(Behavioral Patterns)

关注对象之间的交互和责任分配,确保对象之间能够有效协作。

责任链模式(Chain of Responsibility Pattern):

使多个对象都有机会处理请求,从而避免请求发送者与接收者之间的耦合关系。
适用于处理多个处理环节的场景,如请求处理、日志记录等。

命令模式(Command Pattern):

将请求封装为一个对象,从而使用户能够传递不同的请求、队列或日志请求,并支持可撤销的操作。
适用于实现操作队列、撤销操作等功能。
一般应用场景表现在:撤销/重做功能。任务队列。宏命令。
在这里插入图片描述

解释器模式(Interpreter Pattern):

给定一个语言的语法,定义一个解释器来解释语言中的句子。
适用于需要解析和解释的应用,如正则表达式引擎。

迭代器模式(Iterator Pattern):

提供一种方法顺序访问集合对象中的每个元素,而不暴露集合对象的内部结构。
适用于需要遍历集合类对象的场景。

中介者模式(Mediator Pattern):

用一个中介对象来封装一系列对象之间的交互,使得对象不需要显示地引用其他对象,从而使得松散耦合。
适用于复杂对象交互的场景,如 UI 元素交互。

备忘录模式(Memento Pattern):

捕获一个对象的内部状态,并在必要时恢复该状态,而不暴露该对象的实现细节。
适用于需要保存和恢复对象状态的场景,如撤销操作。

观察者模式(Observer Pattern):

定义对象之间的一对多依赖关系,当一个对象状态改变时,所有依赖于它的对象都会得到通知并自动更新。
适用于事件处理和数据绑定的场景。
一般应用场景表现在:事件处理系统。数据绑定(如Vue.js的响应式系统)。发布-订阅系统。
在这里插入图片描述

状态模式(State Pattern):

允许对象在其内部状态改变时改变其行为,表现出不同的行为。
适用于状态转换较为复杂的场景,如工作流、状态机等。
一般应用场景表现在:状态机(如订单状态),游戏角色状态。
在这里插入图片描述

策略模式(Strategy Pattern):

定义一系列算法,并使它们可以相互替换,算法的使用可以在运行时决定。
适用于有多种算法可以选择的场景,且希望通过选择不同的算法来解决问题。
一般应用场景表现在:动态选择算法(如排序算法)。表单验证规则。支付方式选择。
在这里插入图片描述

模板方法模式(Template Method Pattern):

定义一个操作中的算法骨架,允许子类在不改变算法结构的情况下重新定义算法的某些步骤。
适用于需要一些步骤固定而其他步骤可以灵活变化的场景。
一般应用场景表现在:框架设计。算法复用。
在这里插入图片描述

访问者模式(Visitor Pattern):

通过在不改变元素类的前提下,增加新的操作来访问元素对象。
适用于需要对一组对象执行不同操作,并且不想修改这些对象的情况。

相关文章:

设计模式全解(含代码实例)

目录 设计模式概念耦合与解耦 常见-5种全部-23种创建型模式(Creational Patterns)单例模式(Singleton Pattern)工厂方法模式(Factory Method Pattern):抽象工厂模式(Abstract Factor…...

springboot019-爬虫基于网页开发和数据抓取技术的在线新闻聚合平台的设计与实现

💕💕作者: 小九学姐 💕💕个人简介:十年Java,Python美女程序员一枚,精通计算机专业前后端各类框架。 💕💕各类成品Java毕设 。javaweb,ssm&#xf…...

#渗透测试#批量漏洞挖掘#LiveBos UploadFile 任意文件上传漏洞

免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停止本文章读。 目录 漏洞背景 漏洞成因 影响评估 检测方案 …...

【分布式架构理论3】分布式调用(1):负载均衡

文章目录 零、三种不同的负载均衡一、常见行业负载均衡方案1. 电商与互联网服务2. 金融与支付系统3. 云计算与分布式存储 二、负载均衡策略概述1. 无状态负载均衡(强调公平性)2. 有状态的负载均衡(强调正确性) 三、 总结 零、三种…...

如何安装和运行Zonos:详细步骤指南

如何安装和运行Zonos:详细步骤指南 1. 安装依赖2. 克隆 Zonos 仓库3. 创建 Python 虚拟环境4. 安装 Zonos5. 运行 Zonos6. 总结 Zonos 是一个基于 Python 的语音合成工具,它结合了先进的深度学习技术和语音生成模型,能够生成高质量的语音输出…...

docker学习---第3步:docker实操大模型

文章目录 1.Images2.Container3.DockerfileENTRYPOINT和CMDCOPY和ADDLABLE、EXPOSE和VOLUME卷中的数据是如何做数据备份的? ARG和ENVHEALTHCHECK 跟着b站 胖虎遛二狗学习 Docker动手入门 | 大模型工程师必备技能 (🎉已完结&…...

记录第一次在windows环境编译libuvc库 踩的坑

最近遇到windows下编译libuvc库,实现经usb连接的摄像头拍摄采集。绕了一大圈,记录一下。 首先,作为新手,肯定需要参考大神资料,但是还是踩了坑。 要在windows 环境下安装libuvc的驱动并确保可用,需要经过一系列流程&a…...

快速集成DeepSeek到项目

DeepSeek API-KEY 获取 登录DeekSeek 官网,进入API 开放平台 2. 创建API-KEY 复制API-KEY进行保存,后期API调用使用 项目中集成DeepSeek 这里只展示部分核心代码,具体请查看源码orange-ai-deepseek-biz-starter Slf4j AllArgsConstructo…...

基础连接已经关闭: 服务器关闭了本应保持活动状态的连接

您在进行 HTTP 请求时遇到“基础连接已经关闭: 服务器关闭了本应保持活动状态的连接”的错误,这通常与连接的保持活动(Keep-Alive)设置有关。以下是可能的原因和解决方法: 可能的原因: Keep-Alive 设置: 默…...

[前端] axios网络请求二次封装

一、场景描述 为什么要对axios网络请求进行二次封装? 解决代码的复用,提高可维护性。 —这个有两个方案:一个是二次封装一个是实例化。(设置一些公共的参数,然后进行请求) 为什么可以解决代码的复用: 这是…...

本地部署DeepSeek Nodejs版

目录 1.下载 Ollama 2.下载DeepSeek模型 3.下载 ollama.js 1.下载 Ollama https://ollama.com/ 下载之后点击安装,等待安装成功后,打开cmd窗口,输入以下指令: ollama -v 如果显示了版本号,则代表已经下载成功了。…...

【PL/SQL】常用操作复习20250212

目录标题 1.基本语法结构二级目录三级目录 1.基本语法结构2。变量声明和使用3. SELECT 查询4.插入 insert5.更新UPDATE6.删除(DELETE) 7游标 cursor例子1:基本游标使用例子2:使用FOR循环的简化写法实际应用例子:给高工资员工增加奖金 8 IF 条…...

vue3-02基础认识vue3中main.js入口文件,app.vue(不存在唯一根节点),扩展程序vue-devtools安装

1.main.js入口文件 main.js入口文件 // 引入的再是vue构造函数 // 引入的是createApp的工厂函数-直接进行引用 import { createApp } from vue import App from ./App.vue// vue3中 // createApp(App).mount(#app) // 创建应用实列对象-类似vue2中的vm,app比vm更轻 const app…...

如何下载Qt和运行第一个程序。

Ubuntu24.04 下载比较容易,基本都是无脑操作。途中汇出现有个别package下载不成功的情况,重新下载即可。 文章目录 下载qt运行qt第一个项目 下载qt 1.先找到官网,点击Download。 2.然后选择,community User 3.然后会跳转到这个…...

【MySQL例题】我在广州学Mysql 系列——有关数据备份与还原的示例

ℹ️大家好,我是练小杰,今天周二,明天就是元宵节了呀!!😆 俗话说“众里寻他千百度。蓦然回首,那人却在,灯火阑珊处。” 本文主要对数据库备份与还原的知识点例题学习~~ 前情回顾&…...

硬件学习笔记--40 电磁兼容试验-4 快速瞬变脉冲群试验介绍

目录 电磁兼容试验-快速瞬变脉冲群试验介绍 1.试验目的 2.试验方法 3.判定依据及意义 电磁兼容试验-快速瞬变脉冲群试验介绍 驻留时间是在规定频率下影响量施加的持续时间。被试设备(EUT)在经受扫频频带的电磁影响量或电磁干扰的情况下,在…...

国密算法SM1、SM2、SM3和SM4 具体的使用和区别

国密算法是中国自主研发的密码算法,包括SM1、SM2、SM3和SM4,分别用于不同场景。以下是它们的具体使用和区别: SM1 对称加密算法 类型: 对称加密 密钥长度: 128位 使用场景: 用于数据加密和解密,适用于金融、政务等领域。 特点: …...

在Ubuntu中安装Docker并配置国内镜像

官方下载安装链接 https://docs.docker.com/engine/install/ubuntu/ 1.查看系统版本,并与之与docker文档对应 OS requirements# 查看系统版本命令 lsb_release -a 2.卸载旧版本 Uninstall old versions 3.安装新版本 Installation methods Install using the…...

【大模型】阿里云百炼平台对接DeepSeek-R1大模型使用详解

目录 一、前言 二、DeepSeek简介 2.1 DeepSeek 是什么 2.2 DeepSeek R1特点 2.2.1 DeepSeek-R1创新点 2.3 DeepSeek R1应用场景 2.4 与其他大模型对比 三、阿里云百炼大平台介绍 3.1 阿里云百炼大平台是什么 3.2 阿里云百炼平台主要功能 3.2.1 应用场景 3.3 为什么选…...

DeepSeek本地部署详细指南

DeepSeek本地部署详细指南 随着人工智能技术的飞速发展,本地部署大模型的需求也日益增加。DeepSeek作为一款开源且性能强大的大语言模型,提供了灵活的本地部署方案,让用户能够在本地环境中高效运行模型,同时保护数据隐私。以下是…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)

概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”

2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...

C++.OpenGL (14/64)多光源(Multiple Lights)

多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式

今天是关于AI如何在教学中增强学生的学习体验,我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育,这并非炒作,而是已经发生的巨大变革。教育机构和教育者不能忽视它,试图简单地禁止学生使…...

从面试角度回答Android中ContentProvider启动原理

Android中ContentProvider原理的面试角度解析,分为​​已启动​​和​​未启动​​两种场景: 一、ContentProvider已启动的情况 1. ​​核心流程​​ ​​触发条件​​:当其他组件(如Activity、Service)通过ContentR…...

GraphRAG优化新思路-开源的ROGRAG框架

目前的如微软开源的GraphRAG的工作流程都较为复杂,难以孤立地评估各个组件的贡献,传统的检索方法在处理复杂推理任务时可能不够有效,特别是在需要理解实体间关系或多跳知识的情况下。先说结论,看完后感觉这个框架性能上不会比Grap…...

LUA+Reids实现库存秒杀预扣减 记录流水 以及自己的思考

目录 lua脚本 记录流水 记录流水的作用 流水什么时候删除 我们在做库存扣减的时候,显示基于Lua脚本和Redis实现的预扣减 这样可以在秒杀扣减的时候保证操作的原子性和高效性 lua脚本 // ... 已有代码 ...Overridepublic InventoryResponse decrease(Inventor…...

stm32进入Infinite_Loop原因(因为有系统中断函数未自定义实现)

这是系统中断服务程序的默认处理汇编函数,如果我们没有定义实现某个中断函数,那么当stm32产生了该中断时,就会默认跑这里来了,所以我们打开了什么中断,一定要记得实现对应的系统中断函数,否则会进来一直循环…...

uniapp获取当前位置和经纬度信息

1.1. 获取当前位置和经纬度信息&#xff08;需要配置高的SDK&#xff09; 调用uni-app官方API中的uni.chooseLocation()&#xff0c;即打开地图选择位置。 <button click"getAddress">获取定位</button> const getAddress () > {uni.chooseLocatio…...