设计模式
设计模式
好的,用户问的是“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. 访问者 | 将算法与对象结构分离,便于新增操作而不修改类。 | 文档格式转换、编译器语法树分析。 |
四、核心价值总结
分类 | 关键目标 |
---|---|
创建型 | 解耦对象创建,避免硬编码依赖。 |
结构型 | 优化对象组合,建立灵活结构。 |
行为型 | 高效管理对象协作,明确职责与通信机制。 |
五、如何选择设计模式?
- 明确问题类型:是创建对象、组织结构还是协调行为?
- 分析变化点:识别系统中可能变化的维度(如支付方式、算法策略)。
- 匹配模式:根据问题类型和变化点选择最符合的模式。
- 避免过度设计:仅在必要时引入模式,优先保持代码简洁。
示例:
• 需要动态扩展对象功能 → 装饰器模式
• 需要统一创建一组相关对象 → 抽象工厂模式
• 需要解耦发送者和接收者 → 命令模式
合理运用设计模式,可以显著提升代码的可维护性、可扩展性和可测试性。