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

设计模式(分类)

目录

        设计模式(分类)        设计模式(六大原则)

设计模式是软件工程中一种经过验证的、用于解决特定设计问题的通用解决方案。它们是面向对象编程(Object-Oriented Programming, OOP)实践中提炼出的最佳实践和经验总结,为软件开发者提供了一种标准的方式来处理在软件设计和开发过程中遇到的常见问题。设计模式不仅限于某种特定编程语言,而是跨语言、跨平台的指导性思想,适用于任何支持面向对象特性的编程环境。

每一个设计模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心。能一次又一次使用该方案而不必做重复劳动。设计模式的核心在于提供了相关问题解决方案,简单方便的复用成功的设计和体系结构。

设计模式通常包含以下要素:

  • 名称:每个模式都有一个简洁明了的名称,便于开发者交流和记忆。
  • 问题:描述了模式所要解决的设计问题或矛盾。
  • 解决方案:提出了应对问题的结构化设计方案,包括类、对象、接口的组织方式,以及它们之间的关系和协作方式。
  • 效果:阐述了采用该模式后带来的益处,如提高了代码的可重用性、可扩展性、可维护性,以及如何帮助应对变化等。

设计模式按照其主要关注点和解决的问题领域,通常被划分为以下三大类别:

1. 创建型模式(Creational Patterns)-5种

这类模式主要关注对象的创建过程,旨在通过合理的对象实例化方式来达到解耦、复用、控制复杂性和灵活性等目的。创建型模式着重于“怎样创建对象”这一问题,通过封装对象的创建过程来隐藏实现细节,使得用户无需关心对象是如何被创建出来的。常见的创建型模式包括:

  • 工厂方法模式(Factory Method):定义一个用于创建对象的接口,让子类决定实例化哪个类的对象。使子类实例化过程推迟
  • 抽象工厂模式(Abstract Factory):(抽象接口)提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
  • 单例模式(Singleton):保证一个类仅有一个实例,并提供一个全局访问点。
  • 建造者模式(Builder):(类和构造分离)将一个复杂类的构造与它的表示分离,使得同样的构建过程可以创建不同的表示。
  • 原型模式(Prototype):通过复制现有的对象来创建新对象,而不是从头开始创建。

2. 结构型模式(Structural Patterns)-7种

结构型模式关注对象或类的组合,通过定义对象间的关系(包括继承关系、组合关系、关联关系等)来简化系统的结构,使之更加灵活、高效、可复用。结构型模式主要解决的是“如何组合对象”这一问题,以获得更大的结构化优势。常见的结构型模式包括:

  • 适配器模式(Adapter):将一个类的接口转换成客户期望的另一个接口,使得原本因接口不兼容而不能一起工作的类能够协同工作。
  • 装饰器模式(Decorator):动态地给对象添加额外职责(行为),同时保持对象的类结构不变。
  • 代理模式(Proxy):为其他对象提供一个代理或占位符以控制对这个对象的访问。
  • 外观模式(Facade):为子系统中的一组接口提供一个统一的高层接口,简化外部系统的使用。
  • 桥接模式(Bridge):将抽象部分与其实现部分分离,使它们都可以独立地变化。
  • 组合模式(Composite):将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。
  • 享元模式(Flyweight):运用共享技术有效地支持大量细粒度对象的复用。

3. 行为型模式(Behavioral Patterns)-11种

行为型模式聚焦于对象之间的通信、职责分配及算法的组织方式,描述了如何在类或对象之间分配行为以及算法的结构化。这类模式主要解决的是“怎样设计对象之间的交互”这一问题。常见的行为型模式包括:

  • 策略模式(Strategy):定义了一系列算法,并将每个算法封装起来,使它们可以互相替换,让算法的变化独立于使用它的客户。
  • 模板方法模式(Template Method):在一个抽象类中定义一个操作的骨架,而将一些步骤延迟到子类中实现,使得子类可以在不改变结构的情况下重新定义算法的某些步骤。
  • 观察者模式(Observer):定义了一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知自动更新
  • 迭代器模式(Iterator):提供一种方法顺序访问一个聚合对象的各个元素,而又不需要暴露其内部表示。
  • 责任链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将接收对象链接起来,在链中传递请求,直到有一个对象处理这个请求。
  • 命令模式(Command):将请求封装为一个对象,使用户可以使用不同的请求、队列或者日志请求,以及支持可撤销的操作。
  • 备忘录模式(Memento):在不破坏封装性的前提下,捕获一个对象的内部状态并在该对象之外保存这个状态,以便以后恢复它。
  • 状态模式(State):允许对象在其内部状态改变时改变其行为,对象看起来好像改变了其类。
  • 访问者模式(Visitor):(数据和操作分离)定义一个操作中的作用于元素集合的各元素的新操作,而无需改变集合类。
  • 中介者模式(Mediator):(不直接引用)定义一个中介对象来封装一系列对象之间的交互,降低对象之间的耦合度,使得对象们可以独立地改变它们之间的交互。
  • 解释器模式(Interpreter):给定一个语言的语法表示,定义一个解释器,根据语法表示解释语言中的句子。

相关文章:

设计模式(分类)

目录 设计模式(分类) 设计模式(六大原则) 设计模式是软件工程中一种经过验证的、用于解决特定设计问题的通用解决方案。它们是面向对象编程(Object-Oriented Programming, OOP)实践中提炼出的最佳实…...

请陪伴Kimi和GPT成长

经验的闪光汤圆 但是我想要写实的 你有吗? 岁数大了,希望如何学习新知识呢?又觉得自己哪些能力亟需补强呢? 看论文自然得用Kimi,主要是肝不动了,眼睛也顶不住了。 正好昨天跟专业人士学会了用工作流的办法跟…...

优思学院|ISO45001职业健康安全管理体系是什么?

ISO45001:2018是新公布的国际标准规范,全球备受期待的职业健康与安全国际标准(OH&S)于2018年公布,并将在全球范围内改变工作场所实践。ISO45001将取代OHSAS18001,成为全球工作场所健康与安全的参考。 ISO45001:201…...

抖去推短视频矩阵系统----源头开发

为什么一直说让企业去做短视频矩阵?而好处就是有更多的流量入口,不同平台或账号之间可以进行资源互换,最终目的就是获客留咨,提单转化。你去看一些做得大的账号,你会发现他们在许多大的平台上,都有自己的账…...

Golang函数重试机制实现

前言 在编写应用程序时,有时候会遇到一些短暂的错误,例如网络请求、服务链接终端失败等,这些错误可能导致函数执行失败。 但是如果稍后执行可能会成功,那么在一些业务场景下就需要重试了,重试的概念很简单&#xff0c…...

工业电脑在ESOP工作站行业应用

ESOP工作站行业应用 项目背景 E-SOP是实现作业指导书电子化,并统一管理和集中控制的一套管理信息平台。信迈科技的ESOP终端是一款体积小巧功能齐全的高性价比工业电脑,上层通过网络与MES系统连接,下层连接显示器展示作业指导书。ESOP控制终…...

java项目实战之图书管理系统(1)

✅作者简介:大家好,我是再无B~U~G,一个想要与大家共同进步的男人😉😉 🍎个人主页:再无B~U~G-CSDN博客 1.背景 图书管理系统是一种用于管理图书…...

3DGS渐进式渲染 - 离线生成渲染视频

总览 输入:环绕Object拍摄的RGB视频 输出:自定义相机路径的渲染视频(包含渐变效果) 实现过程 首先,编译3DGS的C代码,并跑通convert.py、train.py和render.py。教程如下: github网址&#xf…...

chromium 协议栈 cronet ios 踩坑案例

1、请求未携带 Accept-Language http header 出现图片加载失败 现象: 访问 https://www.huawei.com/cn/?ic_mediumdirect&ic_sourcesurlent 时出现图片加载失败的问题 预期结果: 原因: 网络库删除了添加 Accept-Language header 的逻…...

Java快速排序知识点(含面试大厂题和源码)

快速排序(Quick Sort)是一种高效的排序算法,采用分治法(Divide and Conquer)的策略来对一个数组进行排序。快速排序的平均时间复杂度为 O(n log n),在最坏的情况下为 O(n^2),但这种情况很少发生…...

SpringBoot整合Swagger2

SpringBoot整合Swagger2 1.什么是Swagger2?(应用场景)2.项目中如何使用2.1 导入依赖2.2 编写配置类2.3 注解使用2.3.1 controller注解:2.3.2 方法注解2.3.3 实体类注解2.3.4 方法返回值注解2.3.5 忽略的方法 3.UI界面 1.什么是Swa…...

C++算法题 - 矩阵

目录 36. 有效的数独54. 螺旋矩阵48. 旋转图像73. 矩阵置零289. 生命游戏 36. 有效的数独 LeetCode_link 请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现…...

记录一个没测出来,有点严重的Bug

前提: 人物:若干个 部门:若干个 部门有一个人物选择框,可以选择所有的人物,且为非必填字段 bug现象: 部门中 的人物选择框每次都少一个人物 代码分析: F12接口后端没问题,定位为前端的问题。 前…...

科学突破可能开创6G通信新时代

格拉斯哥大学开发的火柴盒大小的天线可以为全息通话、改进自动驾驶和更好的医疗保健的世界铺平道路。 格拉斯哥大学表示,这种创新的无线通信天线将超材料的独特特性与复杂的信号处理相结合,有助于构建未来的 6G 网络。 数字编码动态超表面天线&#xf…...

游戏、app抓包

文章目录 协议app抓包游戏抓包 协议 在抓包之前,首先我们要对每个程序使用什么协议有个大致的了解,比如网页这种就是走的http协议。 在一些app中我们通过发送一个请求,然后服务器接受,响应,返回一个数据包&#xff0c…...

PACNet CellNet(代码开源)|bulk数据作细胞分类,评估细胞命运性能的一大利器

文章目录 1.前言2.CellNet2.1CellNet简介2.2CellNet结果 3.PACNet3.1安装R包与加载R包3.2加载数据3.3开始训练和分类3.4可视化分类过程3.5可视化分类结果 4.细胞命运分类和免疫浸润比较 1.前言 今天冲浪看到一个细胞分类性能评估的R包——PACNet,它与转录组分析方法…...

(delphi11最新学习资料) Object Pascal 学习笔记---第10章第1节(定义属性)

第10章 属性和事件 ​ 在过去的三章中,我已经介绍了Object Pascal中面向对象编程(OOP)的基础知识,解释了这些概念并展示了大多数面向对象编程语言中通用特性是如何具体实现的。自Delphi的早期,Object Pascal语言就是一…...

【网络安全 | 密码学】JWT基础知识及攻击方式详析

前言 JWT(Json Web Token)是一种用于在网络应用之间安全地传输信息的开放标准。它通过将用户信息以JSON格式加密并封装在一个token中,然后将该token发送给服务端进行验证,从而实现身份验证和授权。 流程 JWT的加密和解密过程如…...

Chrome修改主题颜色

注意:自定义Chrome按钮只在搜索引擎为Google的时候出现。...

大数据:【学习笔记系列】Flink基础架构

Apache Flink 是一个开源的流处理框架,用于处理有界和无界的数据流。Flink 设计用于运行在所有常见的集群环境中,并且能够以高性能和可扩展的方式进行实时数据处理和分析。下面将详细介绍 Flink 的基础架构组件和其工作原理。 1. Flink 架构概览 Flink…...

[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解

突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 ​安全措施依赖问题​ GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...

【HTML-16】深入理解HTML中的块元素与行内元素

HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

leetcodeSQL解题:3564. 季节性销售分析

leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...

QT: `long long` 类型转换为 `QString` 2025.6.5

在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...

高防服务器能够抵御哪些网络攻击呢?

高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...

什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南

文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/55aefaea8a9f477e86d065227851fe3d.pn…...

dify打造数据可视化图表

一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...

论文笔记——相干体技术在裂缝预测中的应用研究

目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术:基于互相关的相干体技术(Correlation)第二代相干体技术:基于相似的相干体技术(Semblance)基于多道相似的相干体…...

STM32---外部32.768K晶振(LSE)无法起振问题

晶振是否起振主要就检查两个1、晶振与MCU是否兼容;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容(CL)与匹配电容(CL1、CL2)的关系 2. 如何选择 CL1 和 CL…...