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

以下是软件设计中常见的 **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.rhkb.cn/news/43840.html

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

相关文章

革新汽车安全通信技术,美格智能全系车载通信模组支持NG-eCall

根据QYR(恒州博智)的统计及预测,2024年全球汽车无线紧急呼叫(eCall)设备市场销售额达到了25.17亿美元,预计2031年将达到44.97亿美元,年复合增长率(CAGR 2025-2031)为8.8%…

AWE 2025:当AI科技遇见智能家居

3月20日,以“AI科技、AI生活”为主题的AWE2025(中国家电及消费电子博览会)在上海新国际博览中心开幕。作为全球家电行业风向标,本届展会最大的亮点莫过于健康理念在家电领域的全面渗透。从食材保鲜到空气净化,从衣物清…

《Spring Cloud Eureka 高可用集群实战:从零构建高可靠性的微服务注册中心》

从零构建高可用 Eureka 集群 | Spring Cloud 微服务架构深度实践指南 本文核心内容基于《Spring Cloud 微服务架构开发》第1版整理,结合生产级实践经验优化 实验环境:IntelliJ IDEA 2024 | JDK 1.8| Spring Boot 2.1.7.RELEASE | Spring Cloud Greenwich…

蓝桥杯[每日一题] 真题:管道(java版)

题目描述 有一根长度为 len 的横向的管道,该管道按照单位长度分为 len 段,每一段的中央有一个可开关的阀门和一个检测水流的传感器。一开始管道是空的,位于 Li 的阀门会在 Si 时刻打开,并不断让水流入管道。 对于位于 Li 的阀门&a…

2.pycharm部署Ai - 编程好助手

一、pycharm安装continue插件 1.提前安装好pycharm,并双击打开 2.File – Setting 3.Plugins – 搜索Continue , 点击Install安装 4.点ok 二、获取硅基流动API 1.登入网站:https://siliconflow.cn/zh-cn/#/,并注册登入 2.获取AP…

《数据结构:单链表》

“希望就像星星,或许光芒微弱,但永不熄灭。” 博主的个人gitee:https://gitee.com/friend-a188881041351 一.概念与结构 链表是一种物理存储上非连续、非顺序的存储结构,数据元素的顺序逻辑是通过链表中的指针链接次序实现的。 单…

Visual Studio 2019 Qt QML 项目环境搭建常见问题处理方法

在 Visual Studio 2019 运行 Qt/QML 项目比直接使用QtCreator环境麻烦,主要是有qmake 的一些配置项不能在 Visual Studio中设置。下面整理一些常见问题的处理方法,供参考: 搭建VS Qt 环境,在Visual Studios 2019下面安装 Qt Vis…

基于Spring Boot的网上商城系统的设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…

如何监控和优化服务器的 CPU 性能

一、实时监控与诊断工具 1. 核心监控工具 bash 复制 # 实时CPU使用率监控 top -H -p <PID> # 按线程查看CPU占用 htop --sort-keyPERCENT_CPU # 可视化进程CPU排序 mpstat -P ALL 1 # 每核心使用率统计 2. 上下文切换分析 bash 复制 pidstat -w…

【蓝桥杯14天冲刺课题单】Day 1

1. 题目链接&#xff1a;19937 艺术与篮球 该题目的难点主要在20240413这个日期需要结束程序跳出循环。最开始将该输出ans的位置放在了for循环之外&#xff0c;此时的日期已经循环完了2024年所有的日期&#xff0c;则最后会统计多而导致结果错误。 AC代码&#xff1a; #incl…

Masked Attention 在 LLM 训练中的作用与原理

在大语言模型&#xff08;LLM&#xff09;训练过程中&#xff0c;Masked Attention&#xff08;掩码注意力&#xff09; 是一个关键机制&#xff0c;它决定了 模型如何在训练时只利用过去的信息&#xff0c;而不会看到未来的 token。这篇文章将帮助你理解 Masked Attention 的作…

Arduino、ESP32驱动GUVA-S12SD UV紫外线传感器(光照传感器篇)

目录 1、传感器特性 2、控制器和传感器连线图 3、驱动程序 UV紫外线传感器是一个测试紫外线总量的最佳传感器,它不需要使用波长滤波器,只对紫外线敏感。 Arduino UV紫外线传感器,直接输出对应紫外线指数(UV INDEX)的线性电压,输出电压范围大约0~1100mV(对应UV INDEX值…

基于微波光子信道的图像传输系统matlab仿真,调制方式采用OFDM+QPSK,LDPC编译码以及LS信道估计

目录 1.算法仿真效果 2.算法涉及理论知识概要 2.1 OFDMQPSK原理 2.2 微波光子信道简介 3.MATLAB核心程序 4.完整算法代码文件获得 1.算法仿真效果 matlab2022a仿真结果如下&#xff08;完整代码运行后无水印&#xff09;&#xff1a; 仿真操作步骤可参考程序配套的操作视…

【黑马点评】Redis解决集群的session共享问题

由于不同的tomcat服务器之间的session是不共享的&#xff0c;当请求如果在不同tomcat服务器之间切换就会导致数据丢失的问题。 使用redis可以解决session数据共享的问题 redis是tomcat以外的存储&#xff0c;存在redis中的数据&#xff0c;任何一台tomcat都能看得见&#xff0…

淘宝客户端动态化页面搭建

在手机淘宝等高频更新的业务场景中&#xff0c;UI页面的动态化和快速交付成为技术团队面临的重要挑战。本文围绕“客户端动态化页面搭建”这一主题&#xff0c;深入探讨了如何通过抽象框架设计解决高动态化页面的快速构建问题。文章详细介绍了框架的核心模块&#xff08;如Data…

无人机,雷达定点飞行时,位置发散,位置很飘,原因分析

参考&#xff1a; 无人车传感器 IMU与GPS数据融合进行定位机制_gps imu 组合定位原始数-CSDN博客 我的无人机使用雷达定位&#xff0c;位置模式很飘 雷达的更新频率也是10HZ&#xff0c; 而px飞控的频率是100HZ&#xff0c;没有对两者之间的频率差异做出处理 所以才导致无人…

Postman 版本信息速查:快速定位版本号

保持 Postman 更新至最新版本是非常重要的&#xff0c;因为这能让我们享受到最新的功能&#xff0c;同时也保证了软件的安全性。所以&#xff0c;如何快速查看你的 Postman 版本信息呢&#xff1f; 如何查看 Postman 的版本信息教程

Object结构

Object结构 参考博客

数据分析概述

数据分析&#xff1a;用适当的分析方法和挖掘方法对收集来的数据进行研究总结&#xff0c;提取有用的信息&#xff0c;形成结论并支持决策的过程。 一.数据分析的分类 1.业务描述性分析。以数据为分析对象&#xff0c;以探索数据内的有用信息为主要途径&#xff0c;以解决业务…

ubuntu下终端打不开的排查思路和解决方法

问题现象描述&#xff1a;ubuntu开机后系统桌面显示正常&#xff0c;其他图形化的app也都能打开无异常&#xff0c;唯独只有terminal终端打不开&#xff0c;无论是鼠标点击终端软件&#xff0c;还是ctrlaltt&#xff0c;还是altF2后输入gnome-terminal后按回车&#xff0c;这三…