设计模式
1. 概述(Overview)
设计模式是一种对可重复软件设计经验的结构化表达方式,用于解决在特定上下文中反复出现的问题。它既是一种代码组织思想,也是一种团队共同的 沟通语言、认知工具与架构思维框架。
设计模式的价值不在于具体类图或代码技巧,而在于:
- 对“何时、为何、如何抽象”的共识
- 对复杂度与灵活性的权衡能力
- 对软件演进方向和变更来源的理解
设计模式不是编写代码前的模板,而是在项目不断演进中沉淀的结构认知。
2. 本质(Essence)
一个设计模式的存在必须同时满足三点本质特征:
- **重复性(Repetition)**:是对反复出现的问题或结构的提炼
- **可沟通性(Communication)**:模式必须具有命名和传达价值
- **稳定的结构(Structure)**:包含通用角色和组织方式,可用于系统复用
换言之:
设计模式是“可命名的、可复述的、可复用的软件结构化经验”。
它是介于“设计原则”和“具体架构”之间的中观层抽象。
3. 模式的结构化表达模型(Pattern Schema)
为了使模式具备标准化和可复用性,一个成熟的设计模式通常包含以下五个核心元素:
- **名称(Name)**:用于溝通,是最关键的元素
- **意图(Intent)**:解决什么问题,如何优雅地解决
- **结构(Structure)**:角色、职责、协作方式,可用类图或关系描述
- **适用性(Applicability)**:在哪些场景下使用/不使用
- **后果(Consequences)**:优点、限制、代价
这个模板为团队形成与评审设计模式提供统一规范。
4. 设计模式的关键属性(Properties)
设计模式不是单纯的“解决方案”,而是一类具有明确属性的工程经验。高质量的设计模式应具备以下五个通用属性:
4.1 可命名性(Nameability)
必须能用一个简洁的名称表达核心意图。命名是模式存在的前提。
4.2 可复述性(Repeatability)
必须在多个系统或上下文中出现,具有通用性。
4.3 可沟通性(Communicability)
设计模式本质上是沟通语言。一句“用 X 模式”即可传递大量隐含结构信息。
4.4 可复用性(Reusability)
模式的结构在逻辑层面可重用,甚至可以跨语言、跨框架。
4.5 可演化性(Evolvability)
优秀模式可随着技术变化而演化,不是固定不变的代码模板。
5. 模式的边界与误区
设计模式不是银弹,也不是必须使用的工具。错误使用会带来反效果。
5.1 模式的边界
- 不是微观代码技巧(那是 idiom)
- 不是框架级架构(那是 architecture)
- 不直接带来性能收益(主要提升结构弹性)
- 不适用于一次性系统
- 不应强行加入没有变化来源的模块
5.2 常见误区
- 为用模式而用模式(Over-Engineering)
- 抽象过度
- 管理层强制要求“所有模块都用模式”
- 将模式理解成类图模板
6. 模式与设计原则、架构的关系模型
设计模式是一个位于 设计原则与系统架构之间的中观层结构工具。
可以用如下抽象模型表示:
设计原则(Why) → 设计模式(How) → 项目架构(What)6.1 设计原则(Why)
- 是思想
- 抽象且稳定
- 指导如何做“好的软件设计”
- 如 SRP、DIP 等
6.2 设计模式(How)
- 是将原则结构化后的可复用形式
- 是对变化来源的应对方式
6.3 架构(What)
- 是使用多个模式组合构成的系统结构
- 与业务、规模、技术栈相关
- 模式是构建架构的基础粒度
模式不是架构,但架构离不开模式。
7. 设计模式的演化规律(Pattern Evolution Lifecycle)
设计模式不是静态资产,而是长期演进产物。其生命周期可分为:
- **发现(Emergence)**:在多个系统中观察到重复结构
- **抽象(Abstraction)**:提炼出共同角色和协作方式
- **命名(Naming)**:形成可沟通语言
- **验证(Validation)**:跨项目使用并稳定下来
- **泛化(Generalization)**:适用于更广场景,提升抽象度
- **成熟(Maturation)**:成为团队共识
- **弃用(Deprecation)**:随着技术变迁被更优方案取代
例如随着 FP、协程、响应式流的兴起,一些传统 OO 模式已经弱化或演化。
8. 如何发现与沉淀模式(Methodology)
设计模式不是学习来的,而是“抽象出来”的。以下是团队挖掘新模式的流程建议:
8.1 识别重复问题
- 多个项目出现相同痛点
- 多个模块在对付同类变化源
8.2 提炼结构共性
- 抽象角色
- 划分职责
- 找到稳定点与变化点
8.3 命名
名称应准确、简洁、具有认知统一性。
8.4 结构化表达
按照 Pattern Schema 写成规范文档。
8.5 评审
邀请团队讨论,优化边界与适用性。
8.6 归档到模式库(Pattern Repository)
形成团队知识资产。
9. 模式治理体系(Pattern Governance)
要让模式真正成为团队资产,需要:
9.1 模式目录(Pattern Catalog)
包含所有模式的结构化条目。
9.2 模式评审(Pattern Review)
定期评估模式是否仍必要,是否产生反模式。
9.3 模式选型指南(Pattern Decision Matrix)
用于在不同需求变化类型下选择合适模式。
9.4 模式教学与传播
包括新成员培训、架构设计评审中的模式使用建议。
10. 反模式(Anti-Pattern)
反模式是“看似优雅但在大多数情况下反而造成问题”的重复做法。
识别反模式的关键指标:
- **复杂度高于收益**
- **过度抽象导致可读性下降**
- **扩展性被误解为必须灵活**
- **忽略性能、可维护性、一致性**
- **仅为迎合某模式而重构**
在模式 governance 中,反模式是重要治理单元。
11. 模式的价值体系总结(Value Summary)
设计模式的核心价值可以概括为:
- **可沟通性**:团队沟通成本降低
- **可复用性**:减少重复设计
- **可维护性**:提升结构清晰度与可扩展性
- **可预测性**:降低新人上手成本
- **可演化性**:让系统在变化中保持稳定
一句话总结:
设计模式是一种组织复杂软件的结构化认知,是在变化中寻求稳定的工具。
关联内容(自动生成)
- [/软件工程/设计模式/行为模式.html](/软件工程/设计模式/行为模式.html) 涉及策略模式等具体的行为模式实现,与设计模式的核心概念密切相关
- [/软件工程/设计模式/结构型模式.html](/软件工程/设计模式/结构型模式.html) 详细介绍了适配器等结构型模式,是设计模式体系的重要组成部分
- [/软件工程/架构/系统设计/分布式/分布式共识算法.html](/软件工程/架构/系统设计/分布式/分布式共识算法.html) 分布式系统中的共识算法如Raft体现了特定的设计模式和架构思想
- [/软件工程/架构/系统设计/缓存.html](/软件工程/架构/系统设计/缓存.html) 缓存系统的设计与实现体现了多种设计模式的应用,如适配器模式等
- [/软件工程/架构模式/分层架构.html](/软件工程/架构模式/分层架构.html) 分层架构是设计模式在系统架构层面的重要体现,体现了关注点分离的设计思想
- [/计算机网络/网络安全/安全架构.html](/计算机网络/网络安全/安全架构.html) 安全架构中的设计模式与安全组件解耦相关,与设计模式中的架构模式紧密关联
- [/操作系统/操作系统设计.html](/操作系统/操作系统设计.html) 操作系统的设计原则和模式是通用设计模式在特定领域的应用实例
- [/软件工程/架构/系统设计/可观测性.html](/软件工程/架构/系统设计/可观测性.html) 可观测性系统设计中运用了多种设计模式来实现监控、日志和追踪功能
- [/编程语言/JAVA/JakartaEE/Servlet.html](/编程语言/JAVA/JakartaEE/Servlet.html) Servlet规范体现了多个经典的设计模式,是设计模式在Web技术中的典型应用
- [/软件工程/微服务/微服务.html](/软件工程/微服务/微服务.html) 微服务架构是设计模式在分布式系统中的大规模应用,体现了模块化和解耦的设计思想
- [/编程语言/JavaScript/AJAX.html](/编程语言/JavaScript/AJAX.html) AJAX技术体现了前端架构中的设计模式,特别是异步通信相关的模式
- [/软件工程/架构/Serverless.html](/软件工程/架构/Serverless.html) Serverless架构作为一种新兴架构模式,体现了设计模式在云原生时代的新发展
- [/软件工程/架构/系统设计/分布式/分布式事务.html](/软件工程/架构/系统设计/分布式/分布式事务.html) 分布式事务处理中涉及多种设计模式,如两阶段提交等
- [/编程语言/JAVA/框架/Spring/Spring.html](/编程语言/JAVA/框架/Spring/Spring.html) Spring框架广泛运用了多种设计模式,特别是依赖注入和控制反转模式
- [/软件工程/架构/Web前端/Web前端.html](/软件工程/架构/Web前端/Web前端.html) 前端架构设计中包含多种设计模式的应用,与整体设计模式理论相关联
- [/中间件/数据库/redis/数据结构.html](/中间件/数据库/redis/数据结构.html) Redis中使用了享元设计模式等,是设计模式在数据存储系统中的具体应用
- [/软件工程/架构/系统设计/高并发.html](/软件工程/架构/系统设计/高并发.html) 高并发系统设计中大量使用设计模式来处理性能和扩展性问题
- [/软件工程/架构模式/响应式架构.html](/软件工程/架构模式/响应式架构.html) 响应式架构是一种重要的架构模式,体现了设计模式在现代系统架构中的演化
- [/中间件/消息队列/消息队列.html](/中间件/消息队列/消息队列.html) 消息队列设计中广泛运用了多种设计模式,如发布-订阅模式等
- [/个人成长/职场/职业素养.html](/个人成长/职场/职业素养.html) 职业素养中提到的设计模式和架构知识是软件工程师的核心能力之一