一.设计模式的基本概念
一.核心概念
对软件设计中重复出现问题的成熟解决方案,提供代码可重用性、可维护性和扩展性保障。核心原则包括:
1.1. 单一职责原则
- 定义:一个类只承担一个职责,避免因职责过多导致的代码耦合。
1.2. 开闭原则
- 定义:应对扩展开放,对修改关闭。
- 说明:允许添加新功能而不破坏现有系统,已有代码应尽可能保持稳定不修改。
3. 里氏替换原则
- 定义:子类必须能替换父类且不影响程序正确性
- 说明:子类不改变父类原有行为,仅扩展功能。
1.4. 接口隔离原则
- 定义:类不应依赖不需要的接口,需将庞大接口拆分为多个独立小接口
- 说明:减少接口污染,避免类因无关方法被迫变更
1.5. 依赖倒置原则
- 定义:高层模块不依赖低层模块,二者应共同依赖抽象
- 说明:通过接口编程解耦。
1.6. 迪米特法则
- 定义(最少知道原则):对象仅与直接朋友交互,减少与非直接类的依赖。
- 说明:降低耦合,如A调用B,B调用C时,A无需知晓C的存在。
二.分类体系
2.1.创建型
解耦对象创建过程.
设计模式 | 解耦手段 | 适用场景 |
---|---|---|
工厂方法模式 | 子类实现工厂接口,封装具体对象的实例化过程 | 需动态切换同类型对象(如不同数据库连接) |
抽象工厂模式 | 提供接口创建一组关联对象,隔离产品族依赖 | 跨平台UI组件、多套数据库适配等场景 |
建造者模式 | 分离复杂对象的构建步骤与表示方式 | 构造含多部件的对象(如订单、配置对象) |
原型模式 | 通过复制原型实例创建新对象,绕过显式构造函数 | 创建成本高的对象(如深度克隆配置模板) |
单例模式 | 全局唯一访问点,避免重复创建实例 | 资源管理器、配置中心等需全局唯一性的场景 |
2.2.结构型
处理类/对象间的组合关系(包括组合、聚合和依赖关系)
2.2.1什么是组合关系?
关系类型 | 生命周期依赖 | 典型模式应用 | 案例说明 |
---|---|---|---|
组合关系 (Composition) | 强绑定:部分对象不能独立于整体存在 (整体销毁则部分销毁) | 组合模式:文件夹(整体)删除时,其内部文件(部分)同步销毁 | 汽车引擎脱离汽车即失去功能意义 |
聚合关系 (Aggregation) | 弱绑定:部分对象可独立于整体存在 | 装饰器模式:移除咖啡的“牛奶装饰层”后,原始咖啡对象仍有效5 享元模式:棋子对象池独立于棋局存在 | 班级解散后,学生仍可作为独立个体存在 |
依赖关系 (Dependency) | 临时性:通过参数传递临时使用对象 | 代理模式:客户端通过代理对象间接访问真实对象(如网络请求代理) 适配器模式:适配器临时调用被适配对象 | 支付接口适配器中,仅在使用时临时依赖旧支付系统对象 |
2.2.2.结构性设计模式如何处理类/对象间的组合关系?
模式 | 核心目的 | 组合关系处理方式 | 典型应用场景 |
---|---|---|---|
适配器模式 | 解决接口不兼容问题 | 对象组合:适配器类聚合被适配对象,转换接口逻辑 | 集成旧系统、第三方库适配 |
桥接模式 | 分离抽象与实现,支持多维扩展 | 组合抽象与实现:抽象类聚合实现接口,运行时动态绑定(如形状+渲染引擎组合) | 跨平台UI开发、多数据库驱动 |
组合模式 | 统一处理树形结构的部分-整体关系 | 递归组合:容器节点(Composite)聚合子组件(Component),递归调用操作 | 文件系统、组织架构、GUI组件树 |
装饰器模式 | 动态添加功能,避免子类爆炸 | 对象聚合:装饰器类聚合原始对象,叠加新行为(如咖啡+牛奶/糖装饰层) | 流处理(I/O缓冲)、权限校验链 |
外观模式 | 简化复杂子系统的调用 | 聚合子系统对象:外观类组合多个子系统接口,提供统一入口 | 封装SDK、简化API调用 |
享元模式 | 减少重复对象创建,节省资源 | 共享对象池:享元工厂组合共享对象池,复用相同状态(如棋盘中的棋子实例) | 游戏实体管理、文本编辑器字符池 |
代理模式 | 控制对象访问,增强功能 | 对象代理:代理类聚合真实对象,拦截请求(如延迟加载、权限校验) | 远程调用、缓存代理、安全控制 |
2.3.行为型
优化对象间通信与责任分配
模式 | 优化重点 | 典型场景 | 通信/职责特点 |
---|---|---|---|
观察者模式 | 事件通知机制 | 消息订阅、GUI事件响应 | 一对多广播式通信 |
中介者模式 | 集中协调多对象交互 | 聊天室、飞机调度系统 | 多对一中介调度 |
职责链模式 | 动态选择处理者 | 审批流程、异常处理链 | 请求沿链传递,职责动态分配 |
策略模式 | 算法可替换性 | 支付方式、排序算法切换 | 行为抽象,运行时注入 |
状态模式 | 状态驱动行为变更 | 订单状态机、游戏角色状态 | 状态转移触发行为更新 |
命令模式 | 请求封装与生命周期管理 | 操作撤销/重做、任务队列 | 请求对象化,支持存储与回溯 |
💡 如果本文对你有帮助,点击右上角【订阅专栏】或左上角关注我
🔔 完整的23中设计模式干货,第一时间推送给你!
相关文章:
一.设计模式的基本概念
一.核心概念 对软件设计中重复出现问题的成熟解决方案,提供代码可重用性、可维护性和扩展性保障。核心原则包括: 1.1. 单一职责原则 定义:一个类只承担一个职责,避免因职责过多导致的代码耦合。 1.2. 开闭原则 定义…...

以人类演示视频为提示,学习可泛化的机器人策略
25年5月来自清华大学、上海姚期智研究院和星动纪元(RoboEra)公司的论文“Learning Generalizable Robot Policy with Human Demonstration Video as a Prompt”。 最近的机器人学习方法通常依赖于从通过遥操作收集的大量机器人数据集中进行模仿学习…...
split方法
在编程中,split 方法通常用于将字符串按照指定的分隔符拆分成多个部分,并返回一个包含拆分结果的列表(或数组)。不同编程语言中的 split 方法语法略有不同,但核心功能相似。以下是常见语言中的用法: 1. P…...

SOC-ESP32S3部分:36-适配自己的板卡
飞书文档https://x509p6c8to.feishu.cn/wiki/RP4UwPrsKi4xuQkKLAAcKxD3n1b 如果你自己画了PCB板,需要把自己绘制的板卡配置小智AI工程,可以参考此文档。 下载源码 克隆或下载源码到本地,这里以1.5.5为例,大家可以自行修改其它版…...

LLMs 系列科普文(8)
八、模型的自我认知 接下来我们聊聊另一种问题,即模型的自我认知。 网上经常经常可以看到人们会问大语言模型一些关于认知方面的问题,比如“你是什么模型?谁创造了你?” 说实话,其实这个问题有点无厘头。 之所以这么…...
【明日方舟 × 红黑树】干员调度如何不掉线?算法工程的平衡魔法全揭秘!
【明日方舟 红黑树】干员调度如何不掉线?算法工程的平衡魔法全揭秘! 作者:星之辰 标签:#红黑树 #明日方舟 #工程平衡树 #算法科普 #动态数据结构 引子:为什么你的干员调度能实时平衡,从不崩盘?…...
Vue3 + Vite 中使用 Lodash-es 的防抖 debounce 详解
Vue3 Vite 中使用 Lodash-es 的防抖(debounce)详解 在 Vue3 Vite 项目中,debounce 是 lodash-es 中最常用的功能之一,它可以帮助我们优化高频事件的处理。下面我将详细讲解 debounce 的使用方法,并提供一个完整的示例。 Debounce 核心概念…...

机器学习基础相关问题
机器学习相关的基础问题 K-means是否一定会收敛 K-means是否一定会收敛 K-means算法在有限步数内一定会收敛,但收敛到的可能是局部最优解而非全局最优解。以下是详细分析: K-means 的优化目标是最小化 样本到其所归属簇中心的距离平方和(SSE…...

验证负载均衡与弹性伸缩
什么是弹性伸缩(Auto Scaling)? 弹性伸缩是指 云计算平台根据实时负载自动调整计算资源(如服务器实例、容器Pod)数量,以确保系统在高峰时保持稳定,在低谷时节省成本。 什么时候会触发弹性伸缩&…...

Three.js中AR实现详解并详细介绍基于图像标记模式AR生成的详细步骤
文档地址 Three.js中AR实现详解 以下是Three.js中实现AR功能的详细解析,涵盖技术原理、实现步骤、核心组件及优化策略: 🧩 一、技术基础 AR.js框架的核心作用 AR.js是Three.js实现AR的基石,提供以下核心能力: 多模…...
CSS高级技巧及新增属性
CSS高级技巧及新增属性 jarringslee 文章目录 CSS高级技巧及新增属性精灵图 Sprite字体图标 iconfontCSS几何图形的写法更改鼠标样式更改表单轮廓取消文本域的拖拽行内块元素的垂直居中对齐溢出文字处理 CSS布局技巧CSS5新增内容及其他属性新增选择器新增基础属性及其他属性ca…...

GeoBoundaries下载行政区划边界数据(提供中国资源shapefile)
要下载山东省济南市各个区的行政区划边界数据,你可以通过 geoBoundaries 提供的数据来实现。下面是详细步骤,包括网页操作和可选的 Python 自动化方式。 目录 ✅ 一、通过 geoBoundaries 官网手动下载1. 打开官网:2. 查找中国数据:…...
《深入理解 Nacos 集群与 Raft 协议》系列四:日志复制机制:Raft 如何确保提交可靠且幂等
《深入理解 Nacos 集群与 Raft 协议》系列 大家好,我是G探险者! 在前几篇中我们介绍了选主与日志对比机制,它们保证了“谁能成为 Leader”以及“Leader 的日志是否可靠”。 而当 Leader 已选定,系统需要把客户端的写请求写入所…...

大模型如何选型?嵌入模型如何选型?
欢迎来到啾啾的博客🐱。 记录学习点滴。分享工作思考和实用技巧,偶尔也分享一些杂谈💬。 有很多很多不足的地方,欢迎评论交流,感谢您的阅读和评论😄。 目录 引言模型优劣认知与模型选择大模型(L…...
float转换为整型过程中关于小数部分的处理
在大多数编程语言中,将 float 类型转换为整型时,小数部分不会自动进行四舍五入,而是会直接截断(即丢弃小数部分,仅保留整数部分)。具体行为可能因语言而异,以下是常见语言的示例: 1.…...

开源大模型网关:One API实现主流AI模型API的统一管理与分发
以下是对One API的简单介绍: One API是一个使用go语言开发的大语言模型 API 管理与分发系统支持Docker一键快速部署,且资源占用小,高性能开箱支持多平台大模型快速接入,包括OpenAI、Gemini、xAI、Grop、Anthropic Claude、Ollama…...
Java线程工厂:定制线程的利器
在Java中,线程工厂(Thread Factory)是一个创建新线程的工厂。它提供了一种方式,允许你在创建线程时定制线程的属性,比如设置线程名称、线程的优先级、守护线程属性等。 线程工厂的主要目的是将线程的创建逻辑从使用线…...

智慧充电:新能源汽车智慧充电桩的发展前景受哪些因素影响?
全球能源结构转型与碳中和目标的推进,新能源汽车产业迎来爆发式增长,而智慧充电桩作为其核心基础设施,发展前景备受关注。智慧充电不仅关乎用户充电体验的优化,更是电网平衡、能源效率提升的关键环节。 然而,其发展并…...
在Pnetlab6上绕过TPM、安全启动和 RAM 检查安装windows 11笔记
笔者本次安装的windows11的镜像为: zh-cn_windows_11_enterprise_ltsc_2024_x64_dvd_cff9cd2d.iso 1、创建镜像目录并上传iso文件 mkdir /opt/unetlab/addons/qemu/win-win11x64-2024-LTSC //目录名称务必按照官方文档格式,否则无法识别 目录创建完成后,将.iso格式镜像上…...

【网站建设】不同类型网站如何选择服务器?建站项目实战总结
做了几个建站项目后,深刻体会到一件事:不同类型的网站,所采用的服务器策略是完全不同的。 如果选错了服务器方案,可能带来过高的成本、过低的性能,甚至上线失败。 这篇文章分享一下我在实战中的经验,供正在做建站项目的朋友参考。 🚩 1️⃣ 纯展示型网站 —— 静态服务…...
利用Pandas AI完成Excel大模型的结合实现自然语言问数
需求说明 实现对Excel工具的自然语言问数,即可以通过界面上传Excel文件,然后在文本框里通过语言对话的形式问出要统计的内容。比如: 用户数有多少? 语文成绩低于90的用户有多少? ..... 实现思路 Pandas AI是基于…...

iptables实验
实验一:搭建web服务,设置任何人能够通过80端口访问。 1.下载并启用httpd服务器 dnf -y install httpd 开启httpd服务器 systemctl start httpd 查看是否启用 下载并启用iptables,并关闭firewalld yum install iptable…...

前后端分离开发 和 前端工程化
来源:黑马程序员JavaWeb开发教程,实现javaweb企业开发全流程(涵盖SpringMyBatisSpringMVCSpringBoot等)_哔哩哔哩_bilibili 前后端混合开发: 需要使用前端的技术栈开发前端的功能,又需要使用Java的技术栈…...

web端rtmp推拉流测试、抽帧识别计数,一键式生成巡检报告
本文旨在实现无人机城市交通智慧巡检中的一个模块——无人机视频实时推拉流以及识别流并在前端展示,同时,统计目标数量以及违停数量,生成结果评估,一并发送到前端展示。对于本文任何技术上的空缺,可在博主主页前面博客…...

Excel 表格内批量添加前缀与后缀的实用方法
我们经常需要为 Excel 表格中的内容统一添加前缀或后缀,例如给编号加“NO.”、给姓名加“会员_”等。手动操作效率低,本文将介绍几种实用的方法,帮助你快速完成批量添加前缀和后缀的操作。 使用“&”运算符添加前缀或后缀(推…...
Vulkan 3D Tiles渲染器开发笔记1-脚手架搭建
一、项目简介 项目技术栈 CesiumNative + Dear ImGui + Vulkan 1.3 三维地理可视化系统 详细项目功能说明 1. 3DTiles渲染功能 实现完整的3DTiles格式解析与加载引擎支持LOD(Level of Detail)分层细节渲染可加载建筑模型、点云等3DTiles资产示例:加载城市级建筑3DTiles数据…...

2024 CKA题库+详尽解析| 15、备份还原Etcd
目录 免费获取题库配套 CKA_v1.31_模拟系统 15、 备份还原Etcd 题目: 开始操作: 1)、切换集群 2)、登录master并提权 3)、备份Etcd现有数据 4)、验证备份数据快照 5)、查看节点和Pod状态 6&am…...
【C/C++】std::vector成员函数清单
文章目录 std::vector使用指南1 不同版本提供的能力基础:C98 / C03 提供的成员函数C11 新增的成员函数C14:基本无变化(主要是标准库泛化,非 vector 成员变化)C17 引入的新特性(间接影响)C20 新增…...
如何借助Hyper - V在Windows 10中构建安全软件测试环境
视频演示 手把手教你激活 Hyper-V 并安装 Windows 10 虚拟机 一、引言:软件探索的风险与解决方案 在数字化时代,软件更新换代的速度日新月异,对于热衷于探索新软件的朋友而言,主系统中安装新软件时的谨慎态度无可厚非。恶意软件的威胁犹如高悬的达摩克利斯之剑,稍不留…...

西门子 S7-1200 PLC 海外远程运维技术方案
西门子 S7-1200 PLC 海外远程运维技术方案 一、面向海外场景的核心优势 针对跨国企业、海外项目及远程技术支持需求,本方案基于巨控GRM552Y-CHE模块提供无缝的全球化远程PLC运维能力,突破地域及时差限制,显著提升国际项目响应效率。 二、海…...