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

23种设计模式生活化场景,帮助理解

以下是 23种设计模式的生活化场景 及其核心对比,通过日常例子和比喻帮助理解它们的本质区别和应用场景:


创建型模式(5种)

1. 工厂方法(Factory Method)

场景:快餐店的点餐系统。
问题:顾客需要不同套餐(汉堡+可乐、炸鸡+薯条),但不想关心具体制作过程。
解决:定义一个「创建餐品」的接口,由子类(不同分店)决定具体实现。
对比:与简单工厂不同,工厂方法将创建逻辑延迟到子类。

2. 抽象工厂(Abstract Factory)

场景:家具店提供不同风格(北欧、中式)的成套家具。
问题:确保沙发、桌子、椅子风格统一。
解决:抽象工厂接口定义「创建沙发」「创建桌子」等方法,具体工厂(北欧工厂、中式工厂)实现全套产品。
对比:工厂方法创建单一产品,抽象工厂创建产品族。

3. 建造者(Builder)

场景:组装一台高配电脑。
问题:CPU、内存、硬盘等组件组合复杂,需要逐步配置。
解决:建造者类定义组装步骤(setCPU()setRAM()),指挥者(Director)按顺序调用,最终生成完整电脑。
对比:与工厂模式不同,建造者强调分步骤构建复杂对象。

4. 原型(Prototype)

场景:复印机复制文件。
问题:避免重复创建复杂对象的初始化过程(如加载大文件)。
解决:对象实现clone()方法,直接复制自身。
对比:原型通过克隆避免重复计算,工厂通过子类创建新对象。

5. 单例(Singleton)

场景:公司的打印机服务。
问题:确保整个系统只有一个打印任务队列。
解决:私有化构造函数,提供全局访问点getInstance()
对比:单例强调唯一性,其他创建型模式关注对象创建方式。


结构型模式(7种)

6. 适配器(Adapter)

场景:电源转接头(美标→欧标)。
问题:已有接口(美标插头)无法直接使用(欧标插座)。
解决:适配器类包装旧接口,转换为目标接口。
对比:适配器解决接口不兼容,桥接模式提前设计抽象与实现分离。

7. 桥接(Bridge)

场景:遥控器控制不同品牌电视。
问题:遥控器(抽象)和电视(实现)独立变化。
解决:通过组合(遥控器持有电视接口)解耦两者。
对比:桥接是主动设计解耦,适配器是被动补救兼容。

8. 组合(Composite)

场景:文件系统中的文件夹和文件。
问题:统一处理单个文件和文件夹。
解决:定义抽象组件(Component),叶子节点(文件)和容器(文件夹)实现相同接口。
对比:组合处理树形结构,装饰者为对象动态添加功能。

9. 装饰者(Decorator)

场景:给咖啡加料(牛奶、糖)。
问题:动态扩展功能,避免继承爆炸。
解决:装饰者类包装原有对象,递归叠加功能。
对比:装饰者运行时添加功能,代理模式控制访问或增强功能。

10. 外观(Facade)

场景:智能家居一键模式。
问题:操作多个子系统(灯光、空调、音响)太复杂。
解决:外观类提供统一接口(startMovieMode()),内部调用子系统接口。
对比:外观简化接口,中介者协调对象间通信。

11. 享元(Flyweight)

场景:在线游戏中的重复子弹对象。
问题:大量子弹实例消耗内存,但大部分属性(颜色、模型)可共享。
解决:分离内部状态(共享属性)和外部状态(位置、速度),缓存重复部分。
对比:享元优化资源,原型优化对象创建成本。

12. 代理(Proxy)

场景:明星经纪人。
问题:控制对真实对象的访问(如权限检查、延迟加载)。
解决:代理类持有真实对象的引用,在调用前后添加逻辑。
对比:代理控制访问,装饰者增强功能。


行为型模式(11种)

13. 责任链(Chain of Responsibility)

场景:客服系统的多级投诉处理。
问题:请求(用户投诉)需经过多个处理者(客服→主管→经理)。
解决:每个处理者决定自己处理或传递给下一级。
对比:责任链传递请求,命令模式封装请求为对象。

14. 命令(Command)

场景:餐厅点餐订单。
问题:将请求(点菜)封装为对象,支持撤销、排队、日志记录。
解决:定义Command接口(execute()undo()),服务员(Invoker)调用命令。
对比:命令解耦请求发送者和执行者,策略模式解耦算法。

15. 解释器(Interpreter)

场景:计算器解析数学表达式。
问题:定义一种语法(如1+2*3)并解释执行。
解决:构建语法树,定义终结符(数字)和非终结符(运算符)的解释逻辑。
对比:解释器处理特定语法,模板方法定义算法骨架。

16. 迭代器(Iterator)

场景:书架的书籍遍历。
问题:统一访问集合元素(数组、链表),隐藏底层实现。
解决:定义Iterator接口(hasNext()next()),集合类提供迭代器。
对比:迭代器解耦遍历逻辑,访问者模式解耦数据结构和操作。

17. 中介者(Mediator)

场景:机场控制塔协调航班起降。
问题:多个对象(飞机)直接通信会导致依赖混乱。
解决:中介者封装交互逻辑,对象只与中介者通信。
对比:中介者协调多对象,外观模式简化子系统调用。

18. 备忘录(Memento)

场景:游戏存档。
问题:捕获对象状态(角色血量、位置),支持回滚。
解决:备忘录对象保存状态,原发者(游戏角色)负责生成和恢复状态。
对比:备忘录保存状态,命令模式封装操作。

19. 观察者(Observer)

场景:微信公众号订阅。
问题:用户(订阅者)需要实时接收更新(新文章)。
解决:主题(公众号)维护观察者列表,状态变化时通知所有观察者。
对比:观察者一对多通知,中介者多对多协调。

20. 状态(State)

场景:红绿灯状态切换。
问题:对象(红绿灯)行为随状态(红、黄、绿)改变。
解决:将状态抽象为接口,具体状态类实现不同行为。
对比:状态模式处理对象内部状态变化,策略模式切换算法。

21. 策略(Strategy)

场景:导航App选择路线(最快、最短、避开收费)。
问题:动态切换算法(路线计算逻辑)。
解决:定义策略接口,不同策略类实现算法,客户端自由切换。
对比:策略模式解耦算法,命令模式解耦请求。

22. 模板方法(Template Method)

场景:冲泡饮料的固定流程(煮水→加原料→倒杯)。
问题:定义算法骨架(流程),子类实现具体步骤(咖啡、茶)。
解决:抽象类定义模板方法,子类重写钩子方法。
对比:模板方法固定流程,策略模式灵活替换算法。

23. 访问者(Visitor)

场景:医生检查不同患者(小孩、老人)。
问题:在不修改患者类的前提下,添加新操作(体检、开药)。
解决:访问者接口定义visitChild()visitElder(),患者类接受访问者。
对比:访问者分离数据结构和操作,迭代器分离遍历逻辑。


🔍 模式对比总结

分类模式对比
创建型工厂方法(单一产品) vs 抽象工厂(产品族) vs 建造者(分步构建复杂对象)
结构型适配器(接口转换) vs 桥接(抽象与实现解耦) vs 装饰者(动态扩展功能) vs 代理(控制访问)
行为型策略(算法替换) vs 状态(状态驱动行为) vs 观察者(事件通知) vs 责任链(请求传递)
核心目标创建型→对象创建方式;结构型→对象组合方式;行为型→对象间协作与职责分配

相关文章:

23种设计模式生活化场景,帮助理解

以下是 23种设计模式的生活化场景 及其核心对比,通过日常例子和比喻帮助理解它们的本质区别和应用场景: 创建型模式(5种) 1. 工厂方法(Factory Method) • 场景:快餐店的点餐系统。 • 问题&a…...

Android学习总结之OKHttp拦截器和缓存

深入理解 OkHttp 拦截器 1. 拦截器接口详解 Interceptor 接口是自定义拦截器的基础,它仅包含一个抽象方法 intercept。以下是对该方法参数和返回值的详细解释: import okhttp3.Interceptor; import okhttp3.Request; import okhttp3.Response; import…...

Wincc管对象的使用

Wincc管对象的使用 管对象的调用多边形管T形管双T形管管弯头管道大小调整 管对象的调用 打开【图形编辑器】 多边形管 多边形管如下: 一根管子的顶点数是两个,如果修改顶点数,管子就有多少个端点。 修改顶点数为5 此时点击端点然后拖动&#…...

Linux-----驱动

一、内核驱动与启动流程 1. Linux内核驱动 Nor Flash: 可线性访问,有专门的数据及地址总线(与内存访问方式相同)。 Nand Flash: 不可线性访问,访问需要控制逻辑(软件)。 2. Linux启动流程 ARM架构: IRAM…...

GHG认证是什么,GHG认证的意义?对企业发展好处

GHG认证(温室气体认证)详解 GHG认证(Greenhouse Gas Certification,温室气体认证)是指对组织、产品或项目的温室气体(GHG)排放量进行科学量化、报告,并由第三方机构进行独立核查和认…...

Docker 常用命令指南

Docker 提供了丰富的命令行工具来管理镜像、容器、网络和数据卷等资源。本指南按类别整理 Docker 的常用命令,并为每个命令提供简体中文说明和示例,以帮助您快速查询和掌握日常使用。 1. 镜像管理 Docker 镜像(Image)是打包好的应用程序及其依赖环境,可用于创建容器。常用…...

问问lua怎么写DeepSeek,,,,,

很坦白说,这十年,我几乎没办法从互联网找到这个这样的代码,互联网引擎找不到,我也没有很大的“追求”要传承,或者要宣传什么;直到DeepSeek的出现 兄弟,Deepseek现在已经比你更了解你楼下的超市…...

基于神经环路的神经调控可增强遗忘型轻度认知障碍患者的延迟回忆能力

简要总结 这篇文章提出了一种名为CcSi-MHAHGEL的框架,用于基于多站点、多图谱fMRI的功能连接网络(FCN)分析,以辅助自闭症谱系障碍(ASD)的识别。该框架通过多视图超边感知的超图嵌入学习方法,整合…...

C++学习之ORACLE③

1.集合运算符 查询部门号是10和20的员工信息: ?思考有几种方式解决该问题 ? SQL> select * from emp where deptno in(10, 20) SQL> select * from emp where deptno10 or deptno20 集合运算: Select * from emp …...

UniAD:自动驾驶的统一架构 - 创新与挑战并存

引言 自动驾驶技术正经历一场架构革命。传统上,自动驾驶系统采用模块化设计,将感知、预测和规划分离为独立组件。而上海人工智能实验室的OpenDriveLab团队提出的UniAD(Unified Autonomous Driving)则尝试将这些任务整合到一个统一…...

transformers 中的 input_ids 和 labels 是什么

transformers 中的 input_ids 和 labels 是什么 input_ids 是输入文本的数字化表示,而 labels 是模型训练的目标值 在自然语言处理(NLP)和使用 transformers 库进行模型训练时,tokenizer = AutoTokenizer.from_pretrained(model_path) 这行代码是用于从预训练模型路径加载…...

各种排序思路及实现

目录 1.排序概念常见的排序算法 2.常见排序算法实现(1)插入排序直接插入排序希尔排序(缩小增量排序) (2)选择排序直接选择排序堆排序 (3)交换排序冒泡排序快速排序(hoare…...

golang 采用use-go/onvif获取RTSP流

采用https://github.com/use-go/onvif得到完整的RTSP流的地址 全局变量UseGoMain 函数GetDeviceInformation 函数GetRTSPUri 函数 全局变量 这些变量用来设定 ONVIF 设备的连接信息,包含设备地址、用户名和密码 var deviceXaddr "*92.1*8.11*.12*:80" …...

虚幻基础:碰撞帧运算

能帮到你的话,就给个赞吧 😘 文章目录 碰撞碰撞盒线段检测 帧运算:每个程序流就是一帧的计算结果速度过快时(10000),导致每帧移动过大(83),从而导致碰撞盒错过而没有碰撞速度快的碰撞要用线段检测 碰撞 碰撞盒 线段检…...

【北京市小客车调控网站-注册/登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞…...

西湖大学团队开源SaProt等多款蛋白质语言模型,覆盖结构功能预测/跨模态信息搜索/氨基酸序列设计等

2025 年 3 月 22—23 日,上海交通大学「AI 蛋白质设计峰会」正式举行。 本次峰会汇聚了来自清华大学、北京大学、复旦大学、浙江大学、厦门大学等知名高校的 300 多位专家学者,以及 200 余位行业领军企业代表和技术研发人员,深入探讨了 AI 在…...

算法--递归实现【DFS】

题目:指数型枚举 从 1∼n这 n 个整数中随机选取任意多个,输出所有可能的选择方案。 输入格式 输入一个整数 n。 输出格式 每行输出一种方案。 同一行内的数必须升序排列,相邻两个数用恰好 11 个空格隔开。 对于没有选任何数的方案&#xff0c…...

一个批量文件Dos2Unix程序(Microsoft Store,开源)

这个程序可以把整个目录的文本文件改成UNIX格式,源码是用C#写的。 目录 一、从Microsoft Store安装 二、从github获取源码 三、功能介绍 3.1 运行 3.2 浏览 3.3 转换 3.4 转换(无列表) 3.5 取消 3.6 帮助 四、源码解读 五、讨论和…...

无法读取库伦值文件节点解决方案

读取库伦值的目的是为了换算成电流,量化场景功耗用途 1.报错日志 /power_log/debuglogger$ adb shell dmesg | grep -Ei "avc..system_server"[ 79.942272] logd.auditd: type1400 audit(1744279324.832:7149): avc: denied { read } for comm"…...

Linux系统学习Day2——在Linux系统中开发OpenCV

一、OpenCV简介 OpenCV(Open Source Computer Vision Library)是一个开源的跨平台计算机视觉和机器学习库,广泛应用于图像处理、视频分析、物体检测等领域。它提供了丰富的算法和高效的工具集,支持C、Python等多种语言&#xff0c…...

【图像分类】【深度学习】图像分类评价指标

【图像分类】【深度学习】图像分类评价指标 文章目录 【图像分类】【深度学习】图像分类评价指标前言二分类评价指标Accuracy(准确率/精度)Precision(精确率/查准率)Recall(召回率/查全率)F1-ScoreAUC-ROC曲线(Area Under the Curv-Receiver Operating Characteristic Curve)二…...

一组可能的机器学习问题列表

线性回归与多项式拟合的关系最小二乘法在机器学习中的应用梯度下降是如何实现的贝叶斯分类器的应用场景高斯分布与判定在哪里用到模型的评估有哪些参数误差中的偏差和方差定义训练集分组的快捷方式如何度量模型性能查准率查全率的定义roc,aux的含义正则化是什么意思k均值用来解…...

context上下文(一)

创建一个基础的context 使用BackGround函数,BackGround函数原型如下: func Background() Context {return backgroundCtx{} } 作用:Background 函数用于创建一个空的 context.Context 对象。 context.Background() 函数用于获取一个空的 cont…...

蓝桥杯单片机刷题——按键控制距离显示精度

设计要求 驱动超声波传感器,启动距离测量功能,并将其结果显示到数码管上,距离数据单位为m。 按键“S4”定义为“切换”按键,通过此按键切换距离的显示精度(一位或两位小数)。切换顺序如图所示。 数码管显示格式如下图…...

el-time-picker标签的使用

需求&#xff1a; 实现培训日期&#xff0c;用户可以选择某一天的日期&#xff0c;这个比较简单 <el-form-item label"培训日期" prop"startTime"><el-date-picker clearablev-model"form.startTime"type"date"placeholder…...

云平台一键部署【OmniGen】多功能图像生成模型(2025更新版)

OmniGen 是智源推出的一款全新的扩散模型架构&#xff0c;专注于统一图像生成。它简化了图像生成的复杂流程&#xff0c;通过一个框架处理多种任务&#xff0c;例如文本生成图像、图像编辑和基于视觉条件的生成等。此外&#xff0c;OmniGen 通过统一学习结构实现了知识迁移&…...

C/C++ 知识点:解释型语言与编译型语言

文章目录 一、解释型语言与编译型语言1、概念2、主要区别3、示例对比 一、解释型语言与编译型语言 1、概念 解释型语言 代码逐行解释执行&#xff0c;无需提前编译。如&#xff1a;Python、JavaScript、Ruby。 编译型语言 代码先编译成机器码&#xff0c;再直接执行。如&…...

算法训练之动态规划(四)——简单多状态问题

♥♥♥~~~~~~欢迎光临知星小度博客空间~~~~~~♥♥♥ ♥♥♥零星地变得优秀~也能拼凑出星河~♥♥♥ ♥♥♥我们一起努力成为更好的自己~♥♥♥ ♥♥♥如果这一篇博客对你有帮助~别忘了点赞分享哦~♥♥♥ ♥♥♥如果有什么问题可以评论区留言或者私信我哦~♥♥♥ ✨✨✨✨✨✨ 个…...

uniapp离线打包提示未添加videoplayer模块

uniapp中使用到video标签&#xff0c;但是离线打包放到安卓工程中&#xff0c;运行到真机中时提示如下&#xff1a; 解决方案&#xff1a; 1、把media-release.aar、weex_videoplayer-release.aar放到工程的libs目录下; 文档&#xff1a;https://nativesupport.dcloud.net.cn/…...

5. 蓝桥公园

题目描述 小明喜欢观景&#xff0c;于是今天他来到了蓝桥公园。 已知公园有 N 个景点&#xff0c;景点和景点之间一共有 M 条道路。小明有 Q 个观景计划&#xff0c;每个计划包含一个起点 stst 和一个终点 eded&#xff0c;表示他想从 stst 去到 eded。但是小明的体力有限&am…...