什么是设计模式?请简述其作用。
- 标签:设计模式
🏛 业务架构师
设计模式是前人对"代码如何应对变化"的经验封装——在特定场景反复出现的解法,起了名字形成共同词汇。GoF 23 种按目的分创建型、结构型、行为型。
我讲它的三重作用,以及同样重要的边界:
作用
- 对变化免疫:策略模式让"新营销规则"变成加一个类而不是改核心流程——扩展点预埋,业务迭代提速;
- 降低沟通成本:一句"这里用责任链"胜过十句流程描述——模式是设计领域的行业黑话,CR 和文档都因此高效;
- 约束质量下限:单例约束资源唯一、工厂收口创建、代理隔离横切——新人照着模式写,至少不会写出最糟的代码。
边界(架构师更该强调的)
- 模式有税:每层抽象都是理解成本。为不存在的扩展性套模式——只有一种实现的"策略"、只有两个类的"工厂"——是负资产,真实项目里过度设计的技术债清理起来比裸代码更难;
- 模式不是目的:出现"我该怎么用上 XX 模式"的念头时就错了,正确的问题是"这块业务哪里会变"。变化点驱动设计,模式只是落点;
- 业务建模在模式之前:领域逻辑清晰了,模式常常自然浮现;逻辑混乱硬套模式,得到的是结构化的混乱。
我的实践标尺:一个模式值不值得用,看它隔离的变化是否真实存在或高概率到来。设计模式的价值不在"显得专业",在于让系统以最低成本吸收业务变化——这是它作为"业务架构工具"的本质。
🏗 系统架构师
设计模式是面向对象设计中反复出现问题的可复用解法,GoF 23 种按创建型、结构型、行为型分。作用我归纳为三层:
- 沟通语言:说"这里用策略模式",团队立即明白结构与意图,设计与代码评审的抽象层级被拉高——这是被低估的价值;
- 管理变化:封装变化点。策略把"算法变"隔离成可替换实现,工厂把"创建变"收口,观察者把"依赖方变"解耦——开闭原则的具体手段;
- 代码质量:可复用、可扩展、可读,避免面条代码在演进中腐化。
我的辩证态度(架构师必备):模式是工具不是目标——23 种里日常高频的不过策略、工厂、单例、代理、责任链、观察者、模板方法、适配器这十来种;为了模式而模式是设计味的开始(一个 if 能解决的两分支硬上策略类是过度设计)。判断标准:变化的维度是否真实存在、扩展的频率是否值得增加抽象层次。
在系统设计中的映射:模式之上还有架构模式(分层、微服务、事件驱动),思想同源——识别变化,封装变化,依赖抽象。面试我通常带一个真实例子:支付网关从 if-else 重构为策略 + 工厂 + 模板的演进,讲清"什么时候该引入模式"比背定义有说服力。
💻 全栈开发专家
设计模式 = 对特定场景下可复用设计经验的标准化总结(GoF 23 种,分创建型、结构型、行为型三类),本质是**"变化"与"不变"的分离技术**。
作用(对应工程价值):
- 共同词汇:说"这里用策略模式",团队秒懂结构和意图,省掉大段沟通;
- 踩坑预防:每个模式背后都是前人踩过的坑(单例防多例、代理控制访问、观察者解耦依赖);
- 可扩展性:开闭原则的落地手段,加功能不改老代码;
- 重构方向:坏味道(长分支、巨类、紧耦合)都有对应模式化的解法。
我的工程态度(这么收尾比较加分):
- 模式是重构出来的,不是设计出来的——先写最简单的实现,变化出现了再引入模式;
- 过度设计的抽象比重复代码更难维护,"两个案例之前别抽象";
- 23 种里高频的就七八个:单例、工厂、策略、模板方法、责任链、代理、观察者、建造者;
- 学习方式:读框架源码(Spring/MyBatis 是最好的教材)+ 重构实战,比背类图有效一个量级。
一句话:设计模式让代码"应对变化的能力"变成可复制的工程资产。