软件的常用设计模式。可参考一个一个学习

以下是软件设计中常见的 **23种经典设计模式**(基于《设计模式:可复用面向对象软件的基础》GoF 的经典分类),并结合 **Python 语言特性**的简要说明和典型应用场景。我将它们分为 **创建型、结构型、行为型** 三大类,供你系统学习:

---

### **一、创建型模式 (Creational Patterns)**
关注对象的创建机制,提高代码灵活性和可复用性。
1. **单例模式 (Singleton)**  
   - **目的**: 确保一个类只有一个实例,并提供全局访问点。  
   - **Python 应用**: 模块天然单例、元类控制实例化、`__new__` 方法重写。  
   - **场景**: 配置管理、数据库连接池。

2. **工厂方法模式 (Factory Method)**  
   - **目的**: 定义一个创建对象的接口,由子类决定实例化哪个类。  
   - **Python 应用**: 类方法作为工厂函数,返回不同子类对象。  
   - **场景**: 动态创建不同数据格式的解析器。

3. **抽象工厂模式 (Abstract Factory)**  
   - **目的**: 创建一系列相关或依赖对象的家族,而无需指定具体类。  
   - **Python 应用**: 通过工厂类组合多个工厂方法。  
   - **场景**: GUI 库跨平台组件(按钮、文本框)。

4. **建造者模式 (Builder)**  
   - **目的**: 将复杂对象的构建与其表示分离,分步骤构造对象。  
   - **Python 应用**: 链式调用配置对象属性。  
   - **场景**: 构造复杂查询语句、HTTP 请求生成。

5. **原型模式 (Prototype)**  
   - **目的**: 通过复制现有对象来创建新对象,避免重复初始化。  
   - **Python 应用**: `copy` 模块(`deepcopy` 实现深拷贝)。  
   - **场景**: 游戏中的敌人克隆、配置模板复制。

---

### **二、结构型模式 (Structural Patterns)**
处理类或对象的组合,形成更大的结构。
6. **适配器模式 (Adapter)**  
   - **目的**: 将不兼容接口转换为客户端期望的接口。  
   - **Python 应用**: 类适配器(多继承)、对象适配器(组合)。  
   - **场景**: 集成第三方库的旧接口。

7. **桥接模式 (Bridge)**  
   - **目的**: 将抽象部分与其实现部分分离,使二者独立变化。  
   - **Python 应用**: 抽象类与实现类解耦。  
   - **场景**: 不同图形渲染引擎的切换。

8. **组合模式 (Composite)**  
   - **目的**: 以树形结构组合对象,统一处理单个对象和组合对象。  
   - **Python 应用**: 递归处理文件系统目录结构。  
   - **场景**: 菜单嵌套子菜单、UI 组件树。

9. **装饰器模式 (Decorator)**  
   - **目的**: 动态地为对象添加额外职责,比继承更灵活。  
   - **Python 应用**: `@decorator` 语法糖,函数包装器。  
   - **场景**: 日志记录、权限校验、缓存增强。

10. **外观模式 (Facade)**  
    - **目的**: 提供统一的接口简化子系统复杂性。  
    - **Python 应用**: 封装底层模块调用流程。  
    - **场景**: API 网关、数据库迁移工具。

11. **享元模式 (Flyweight)**  
    - **目的**: 共享大量细粒度对象,减少内存消耗。  
    - **Python 应用**: 缓存常用对象(如字符、图标)。  
    - **场景**: 文本编辑器中的字符渲染、游戏中的粒子系统。

12. **代理模式 (Proxy)**  
    - **目的**: 为其他对象提供代理以控制对其访问。  
    - **Python 应用**: 延迟加载(Lazy Loading)、权限控制。  
    - **场景**: 图片懒加载、ORM 中的延迟查询。

---

### **三、行为型模式 (Behavioral Patterns)**
关注对象间的通信和职责分配。
13. **责任链模式 (Chain of Responsibility)**  
    - **目的**: 将请求的发送者和接收者解耦,使多个对象都有机会处理请求。  
    - **Python 应用**: 链表式处理器传递请求。  
    - **场景**: HTTP 中间件、异常处理链。

14. **命令模式 (Command)**  
    - **目的**: 将请求封装为对象,支持请求的排队、日志、撤销。  
    - **Python 应用**: 封装函数为可调用对象。  
    - **场景**: 任务队列、GUI 按钮操作。

15. **解释器模式 (Interpreter)**  
    - **目的**: 定义语言的语法,并解释执行语句。  
    - **Python 应用**: 实现 DSL(领域特定语言)。  
    - **场景**: 正则表达式引擎、SQL 解析。

16. **迭代器模式 (Iterator)**  
    - **目的**: 提供一种方法顺序访问聚合对象的元素,而无需暴露内部结构。  
    - **Python 应用**: `__iter__` 和 `__next__` 方法实现迭代协议。  
    - **场景**: 遍历自定义集合、分页查询。

17. **中介者模式 (Mediator)**  
    - **目的**: 定义一个中介对象封装对象间的交互,降低耦合度。  
    - **Python 应用**: 聊天室协调多个用户通信。  
    - **场景**: 事件总线、UI 组件通信。

18. **备忘录模式 (Memento)**  
    - **目的**: 在不破坏封装的前提下,捕获并保存对象状态以便恢复。  
    - **Python 应用**: 序列化对象状态(`pickle`)。  
    - **场景**: 撤销操作、游戏存档。

19. **观察者模式 (Observer)**  
    - **目的**: 定义对象间的一对多依赖关系,当对象状态变化时自动通知依赖项。  
    - **Python 应用**: Django Signals、事件监听。  
    - **场景**: 实时数据监控、发布订阅系统。

20. **状态模式 (State)**  
    - **目的**: 允许对象在其内部状态改变时改变行为。  
    - **Python 应用**: 状态机实现,上下文类委托状态对象。  
    - **场景**: 订单状态流转、游戏角色行为切换。

21. **策略模式 (Strategy)**  
    - **目的**: 定义一系列算法,封装每个算法并使它们可互换。  
    - **Python 应用**: 函数作为一等公民传递策略。  
    - **场景**: 排序算法选择、支付方式切换。

22. **模板方法模式 (Template Method)**  
    - **目的**: 定义算法的骨架,将某些步骤延迟到子类实现。  
    - **Python 应用**: 抽象基类(`abc` 模块)定义模板方法。  
    - **场景**: 数据处理的标准化流程(如 ETL)。

23. **访问者模式 (Visitor)**  
    - **目的**: 在不修改类的前提下为类添加新操作。  
    - **Python 应用**: 双重分派(`@singledispatch`)。  
    - **场景**: 语法树分析、报表生成。

---

### **其他常用模式 (补充)**
- **依赖注入 (Dependency Injection)**: 通过外部传递依赖对象(如 Flask 的上下文管理)。
- **对象池模式 (Object Pool)**: 复用昂贵资源(如数据库连接池)。
- **规格模式 (Specification)**: 组合业务规则(如查询过滤器)。

---

### **学习建议**
1. **按分类循序渐进**:先掌握创建型,再结构型,最后行为型。
2. **结合 Python 特性**:理解 Python 的动态性和简洁语法如何简化模式实现。
3. **实践项目驱动**:尝试在框架(如 Django、Flask)或开源代码中寻找模式应用。
4. **对比模式差异**:例如区分「策略模式」与「状态模式」、「代理模式」与「装饰器模式」。

如果需要更详细的某个模式的代码示例或深入解析,请告诉我,我可以为你展开说明!

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

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

相关文章

性能比拼: Go(Gin) vs Python(Flask)

本内容是对知名性能评测博主 Anton Putra Go (Golang) vs Python Performance Benchmark (Kubernetes - OpenTelemetry - Prometheus - S3/Postgres) 内容的翻译与整理, 有适当删减, 相关指标和结论以原作为准 在本视频中,我们将比较 Golang 和 Python 的性能。 但…

Android版本更新服务通知下载实现

在日常开发中,我们肯定会有检查版本更新的需求,那我版本更新的轮子网上也是有的,想自己实现一下代码如下: 下载管理类: public class DownLoadManager {private static final String MAIN "main"; //Tagp…

UE5学习笔记 FPS游戏制作33 换子弹 动画事件

新建动画蒙太奇 为Rifle和Launcher各自新建一个动画蒙太奇,拖入动画,注意动画的轨道要和动画蓝图里的一致 在蒙太奇添加动画事件 在通知一栏新增一个轨道,右键轨道,新增一个 换枪完成 通知,不同动画的同名通知需要…

uniapp中uploadFile的用法

基本语法 uni.uploadFile(OBJECT)OBJECT 是一个包含上传相关配置的对象,常见参数如下: 参数类型必填说明urlString是开发者服务器地址。filePathString是要上传文件资源的本地路径。nameString是文件对应的 key,开发者在服务端可以通过这个 …

Android设计模式之责任链模式

一、定义: 使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系将这些对象连城一条链,并沿着这条链传递该请求,只到有对象处理它为止。 二、模式结构: 抽象处理者(Handler&#xff…

Oracle数据库数据编程SQL<3.3 PL/SQL 游标>

游标(Cursor)是Oracle数据库中用于处理查询结果集的重要机制,它允许开发者逐行处理SQL语句返回的数据。 目录 一、游标基本概念 1. 游标定义 2. 游标分类 二、静态游标 (一)显式游标 【一】不带参数,普通的显示游标 1. 显式…

逗万DareWorks|创意重构书写美学,引领新潮无界的文创革命

当传统文具陷入同质化泥潭时,逗万DareWorks品牌犹如一颗璀璨的明星,以其独特的创意理念和卓越的产品品质,迅速赢得了广大消费者的青睐。 逗万DareWorks隶属于东莞司贸文教赠品有限公司,后者深耕制笔行业45年,占地4.6万…

写Prompt的技巧和基本原则

一.基本原则 1.一定要描述清晰你需要大模型做的事情,不要模棱两可 2.告诉大模型需要它做什么,不需要做什么 改写前: 请帮我推荐一些电影 改写后: 请帮我推荐2025年新出的10部评分比较高的喜剧电影,不要问我个人喜好等其他问题&#xff…

【React】基于 React+Tailwind 的 EmojiPicker 选择器组件

1.背景 React 写一个 EmojiPicker 组件,基于 emoji-mart 组件二次封装。支持添加自定义背景 、Emoji 图标选择!并在页面上展示! 2.技术栈 emoji-mart/data 、emoji-mart : emoji 图标库、元数据 tailwindcss: 原子化 CSS 样式库 antd : 组…

Qt中绘制不规则控件

在Qt中绘制不规则控件可通过设置遮罩(Mask)实现。以下是详细步骤: ‌继承目标控件‌:如QPushButton或QWidget。‌重写resizeEvent‌:当控件大小变化时,更新遮罩形状。‌创建遮罩区域‌:使用QRegion或QPain…

Parallel_Scheduling_of_DAGs_under_Memory_Constraints论文阅读

内存约束下的 DAG 并行调度 点击阅读原文语雀链接更清晰 摘要 科学工作流通常被建模为任务的有向无环图(DAG),这些任务代表计算模块及其依赖关系,依赖关系表现为任务生成的数据被其他任务使用。这种形式化方法允许使用运行时系统&…

探索MVC、MVP、MVVM和DDD架构在不同编程语言中的实现差异

MVC与MVP/MVVM/DDD架构对比,不同语言实现 MVC 分层架构设计概述 模型-视图-控制器(Model-View-Controller,简称 MVC)是一种经典软件架构设计,通过分层解耦,使得系统结构清晰和易于维护,具有良…

一文读懂 UML:基础概念与体系框架

UML 图是一种标准化的建模语言,在软件开发和系统设计等领域有着广泛的应用。以下是对 UML 图各类图的详细介绍: 1.用例图 定义:用例图是从用户角度描述系统功能的模型图,展现了系统的参与者与用例之间的关系。作用:帮…

Spring 及 Spring Boot 条件化注解(15个)完整列表及示例

Spring 及 Spring Boot 条件化注解完整列表及示例 1. 所有条件化注解列表 Spring 和 Spring Boot 提供了以下条件化注解(共 15 个),用于在配置类或方法上实现条件化注册 Bean 或配置: 注解名称作用来源框架Conditional自定义条件…

【Kafka】深入探讨 Kafka 如何保证一致性

文章目录 Kafka 基本概念回顾​副本角色​ 数据写入一致性​同步副本(ISR)集合​数据读取一致性​故障处理与一致性恢复​总结​ 在分布式系统领域,数据一致性是至关重要的一环。作为一款高性能的分布式消息队列系统,Kafka 在设计…

从入门到精通:SQL注入防御与攻防实战——红队如何突破,蓝队如何应对!

引言:为什么SQL注入攻击依然如此强大? SQL注入(SQL Injection)是最古老且最常见的Web应用漏洞之一。尽管很多公司和组织都已经采取了WAF、防火墙、数据库隔离等防护措施,但SQL注入依然在许多情况下能够突破防线&#…

【算法day27】有效的数独——请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。

36. 有效的数独 请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例…

leetcode 2360. 图中的最长环 困难

给你一个 n 个节点的 有向图 ,节点编号为 0 到 n - 1 ,其中每个节点 至多 有一条出边。 图用一个大小为 n 下标从 0 开始的数组 edges 表示,节点 i 到节点 edges[i] 之间有一条有向边。如果节点 i 没有出边,那么 edges[i] -1 。…

PySpur: AI 智能体可视化开发平台

GitHub:https://github.com/PySpur-Dev/pyspur 更多AI开源软件:发现分享好用的AI工具、AI开源软件、AI模型、AI变现 - 小众AI PySpur是一个开源的轻量级可视化AI智能体工作流构建器,旨在简化AI系统的开发流程。通过拖拽式界面,用户…

vcpkg安装及使用教程,以安装matio库解析mat文件为例

vcpkg安装及使用教程,以安装matio库解析mat文件为例 1. vcpkg安装2 安装matio三方库3 将三方库集成到VS中3.1 全局集成3.2 集成到特定工程4 结语Vcpkg 是微软开发的一款开源的 C/C++ 包管理工具,旨在简化 C/C++ 项目依赖库的安装和管理。它支持跨平台(Windows、Linux、macO…