一.设计模式的基本概念

news2025/6/9 7:08:13

一.核心概念

对软件设计中重复出现问题的成熟解决方案,提供代码可重用性、可维护性和扩展性保障。核心原则包括:

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中设计模式干货,第一时间推送给你!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2405089.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

以人类演示视频为提示,学习可泛化的机器人策略

25年5月来自清华大学、上海姚期智研究院和星动纪元(RoboEra)公司的论文“Learning Generalizable Robot Policy with Human Demonstration Video as a Prompt”。 最近的机器人学习方法通​​常依赖于从通过遥操作收集的大量机器人数据集中进行模仿学习…

SOC-ESP32S3部分:36-适配自己的板卡

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

LLMs 系列科普文(8)

八、模型的自我认知 接下来我们聊聊另一种问题,即模型的自我认知。 网上经常经常可以看到人们会问大语言模型一些关于认知方面的问题,比如“你是什么模型?谁创造了你?” 说实话,其实这个问题有点无厘头。 之所以这么…

机器学习基础相关问题

机器学习相关的基础问题 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的基石,提供以下核心能力: 多模…

GeoBoundaries下载行政区划边界数据(提供中国资源shapefile)

要下载山东省济南市各个区的行政区划边界数据,你可以通过 geoBoundaries 提供的数据来实现。下面是详细步骤,包括网页操作和可选的 Python 自动化方式。 目录 ✅ 一、通过 geoBoundaries 官网手动下载1. 打开官网:2. 查找中国数据&#xff1a…

大模型如何选型?嵌入模型如何选型?

欢迎来到啾啾的博客🐱。 记录学习点滴。分享工作思考和实用技巧,偶尔也分享一些杂谈💬。 有很多很多不足的地方,欢迎评论交流,感谢您的阅读和评论😄。 目录 引言模型优劣认知与模型选择大模型(L…

开源大模型网关:One API实现主流AI模型API的统一管理与分发

以下是对One API的简单介绍: One API是一个使用go语言开发的大语言模型 API 管理与分发系统支持Docker一键快速部署,且资源占用小,高性能开箱支持多平台大模型快速接入,包括OpenAI、Gemini、xAI、Grop、Anthropic Claude、Ollama…

智慧充电:新能源汽车智慧充电桩的发展前景受哪些因素影响?

全球能源结构转型与碳中和目标的推进,新能源汽车产业迎来爆发式增长,而智慧充电桩作为其核心基础设施,发展前景备受关注。智慧充电不仅关乎用户充电体验的优化,更是电网平衡、能源效率提升的关键环节。 然而,其发展并…

【网站建设】不同类型网站如何选择服务器?建站项目实战总结

做了几个建站项目后,深刻体会到一件事:不同类型的网站,所采用的服务器策略是完全不同的。 如果选错了服务器方案,可能带来过高的成本、过低的性能,甚至上线失败。 这篇文章分享一下我在实战中的经验,供正在做建站项目的朋友参考。 🚩 1️⃣ 纯展示型网站 —— 静态服务…

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.”、给姓名加“会员_”等。手动操作效率低,本文将介绍几种实用的方法,帮助你快速完成批量添加前缀和后缀的操作。 使用“&”运算符添加前缀或后缀(推…

2024 CKA题库+详尽解析| 15、备份还原Etcd

目录 免费获取题库配套 CKA_v1.31_模拟系统 15、 备份还原Etcd 题目: 开始操作: 1)、切换集群 2)、登录master并提权 3)、备份Etcd现有数据 4)、验证备份数据快照 5)、查看节点和Pod状态 6&am…

西门子 S7-1200 PLC 海外远程运维技术方案

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

嵌入式学习--江协stm32day5

USART 1. 引脚与接口层 异步引脚: TX:发送数据输出;RX:接收数据输入;SW_RX:单线半双工模式的接收引脚(替代 RX)。 同步引脚:SCLK:同步模式下的时钟输出&…

(LeetCode 动态规划(基础版))96. 不同的二叉搜索树 (递推 || 递归)

题目:96. 不同的二叉搜索树 思路:二叉树长度为n时,枚举每个点u作为根节点root,那么root左边的数构成左子树种数left,root右边的数构成右子树种数right,那么当前u为根节点下,二叉树的种数为left*…

vue项目使用svg图标

下面是在 Vue 3 项目中完整引入和使用 vite-plugin-svg-icons 的步骤 1、安装插件 npm install vite-plugin-svg-icons -D # 或 yarn add vite-plugin-svg-icons -D # 或 pnpm add vite-plugin-svg-icons -D 2、配置 Vite 在 vite.config.ts 或 vite.config.js 中配置&…