跳至主要內容

设计模式

Entity大约 6 分钟

设计模式

中文英文

好的,用户问的是“23种设计模式包含哪些,分别解决什么问题”。首先,我需要确定用户对设计模式的理解程度。之前我们讨论过SOLID原则和一些具体的设计模式,比如装饰器、策略、工厂等,所以用户可能有一定的知识基础,现在希望系统了解所有23种模式及其用途。

接下来,我需要回忆并整理GoF的23种设计模式,分为创建型、结构型、行为型三类。要确保每个模式的名称正确,并对应到正确的分类中。然后,针对每个模式,简要说明其解决的问题和应用场景,避免过于技术化,让用户容易理解。

用户可能的需求是快速查阅或作为学习参考,因此需要结构清晰,分点明确。可能需要用表格或分类来组织信息,但根据用户之前的对话,他们似乎适应Markdown格式的分段和列表。所以,我应该按类别划分,每个类别下列出模式,每个模式用简短的描述和示例。

需要避免信息过载,但又要足够详细,让用户了解每个模式的核心目的。比如,单例模式确保一个类只有一个实例,工厂方法解耦对象的创建和使用等。同时,可能需要提到一些常见的使用场景,比如适配器模式用于整合第三方库,观察者模式用于事件处理等。

另外,用户可能对某些模式的区别感兴趣,比如之前问过装饰器和策略模式的区别,所以需要确保每个模式的解释足够明确,避免混淆。同时,注意使用用户之前熟悉的例子,如支付系统、日志记录等,保持一致性。

最后,检查是否有遗漏或错误,确保23种模式全部涵盖,并且分类正确。可能需要参考权威资料确认每个模式的定义和用途,确保准确性。

以下是 GoF(Gang of Four)提出的23种设计模式的分类及其解决的问题和应用场景总结,帮助您快速理解其核心思想:


一、创建型模式(Creational Patterns)

解决对象创建的灵活性与复杂性问题,避免直接使用new关键字硬编码依赖。

模式核心思想典型应用场景
1. 工厂方法定义创建对象的接口,由子类决定实例化哪个类。跨平台UI组件创建(如按钮、对话框)。
2. 抽象工厂创建相关或依赖对象的家族,无需指定具体类。生成整套主题UI控件(如深色/浅色主题)。
3. 单例确保一个类只有一个实例,并提供全局访问点。数据库连接池、日志管理器。
4. 建造者分步骤构建复杂对象,允许灵活配置不同表示。构造个性化订单、生成复杂XML/JSON。
5. 原型通过复制现有对象来创建新对象,避免重复初始化。游戏中的敌人克隆、配置模板复制。

二、结构型模式(Structural Patterns)

解决类与对象的组合问题,建立清晰、可扩展的结构。

模式核心思想典型应用场景
6. 适配器转换接口使得不兼容的类可以协同工作。整合第三方库、旧系统接口升级。
7. 桥接分离抽象与实现,使两者可以独立变化。跨平台渲染引擎、设备与驱动程序解耦。
8. 组合将对象组合成树形结构,统一对待单个对象和组合。文件系统目录树、UI控件嵌套。
9. 装饰器动态为对象添加职责,通过嵌套包装扩展功能。数据流加密压缩、中间件管道。
10. 外观为复杂子系统提供简化接口,隐藏内部复杂性。一键启动计算机、简化API调用流程。
11. 享元共享细粒度对象,减少内存占用(如缓存池)。文本编辑器中的字符对象复用。
12. 代理为其他对象提供代理以控制访问(如延迟加载、权限校验)。图片懒加载、远程服务代理。

三、行为型模式(Behavioral Patterns)

解决对象间的职责分配与通信问题,提高协作效率。

模式核心思想典型应用场景
13. 责任链将请求沿处理链传递,直到有对象处理它。审批流程、异常处理链、HTTP中间件。
14. 命令将请求封装为对象,支持撤销、队列和日志功能。文本编辑器的撤销/重做、任务队列。
15. 解释器定义语法规则,解释特定语言中的句子。正则表达式解析、SQL查询解析。
16. 迭代器提供统一接口遍历集合元素,隐藏底层实现。遍历树形结构、自定义集合的访问。
17. 中介者集中对象间的交互逻辑,减少直接耦合。聊天室消息中转、GUI组件协调。
18. 备忘录捕获对象状态并在需要时恢复,支持撤销操作。游戏存档、事务回滚。
19. 观察者定义一对多的依赖关系,状态变化时自动通知所有观察者。事件通知系统、股票价格更新。
20. 状态允许对象在内部状态改变时改变行为。订单状态机、游戏角色行为切换。
21. 策略定义算法族并封装,使其可互相替换。支付方式选择、排序算法动态切换。
22. 模板方法定义算法骨架,子类重写特定步骤而不改变结构。数据导出流程、自动化测试框架。
23. 访问者将算法与对象结构分离,便于新增操作而不修改类。文档格式转换、编译器语法树分析。

四、核心价值总结

分类关键目标
创建型解耦对象创建,避免硬编码依赖。
结构型优化对象组合,建立灵活结构。
行为型高效管理对象协作,明确职责与通信机制。

五、如何选择设计模式?

  1. 明确问题类型:是创建对象、组织结构还是协调行为?
  2. 分析变化点:识别系统中可能变化的维度(如支付方式、算法策略)。
  3. 匹配模式:根据问题类型和变化点选择最符合的模式。
  4. 避免过度设计:仅在必要时引入模式,优先保持代码简洁。

示例
• 需要动态扩展对象功能 → 装饰器模式
• 需要统一创建一组相关对象 → 抽象工厂模式
• 需要解耦发送者和接收者 → 命令模式

合理运用设计模式,可以显著提升代码的可维护性可扩展性可测试性