一、什么是设计模式
设计模式(Design Pattern)是面向对象软件开发领域沉淀下来的最佳实践,是开发人员在长期项目迭代中,针对软件开发里反复出现的通用问题,总结提炼出来的一套可复用解决方案。
它不是某段固定代码,也不是编程语言语法,而是一套设计思想与思路。这些方案经过大量项目试错验证,用来解决对象创建、类组合、对象交互等常见设计难题,帮助开发者写出高复用、低耦合、易维护扩展的代码。
设计模式起源于GoF(四人帮)1994年《设计模式:可复用面向对象软件的基础》一书,书中整理出23种经典面向对象设计模式,也就是我们常说的GoF23种设计模式。
通俗理解:设计模式就像软件开发的“解题手册”。遇到同类业务设计问题,不必从零反复造轮子,可以参考成熟的思路进行设计。
二、谁适合学习设计模式
- 新手开发者:快速学习面向对象设计思维,跳出只会写业务逻辑的阶段,建立代码架构意识。
- 有开发经验的工程师:复用行业成熟方案,优化现有项目代码质量,解决耦合过重、扩展困难等问题。
- 面试准备人员:设计模式是后端、架构岗位高频面试考点,同时也是读懂主流框架源码的基础(Spring、MyBatis等大量使用设计模式)。
💡前置基础:需要掌握面向对象基础:封装、继承、多态、抽象类、接口等概念。本系列后续示例主要以Java语言演示。
三、面向对象六大设计原则
六大原则是设计模式的底层思想,所有设计模式本质上都是对这些原则的落地实现,理解原则才能避免死记硬背模式。
- 开闭原则(OCP)
对扩展开放,对修改关闭。系统迭代新增功能,尽量不修改原有已上线代码,通过扩展实现新能力,提升系统稳定性,一般依靠接口、抽象类实现。 - 里氏替换原则(LSP)
凡是基类能够出现的地方,子类一定可以替换基类,而不破坏原有业务逻辑。是继承复用的基础,约束继承关系,防止滥用继承带来的bug。 - 依赖倒置原则(DIP)
高层模块和低层模块都应该依赖抽象,而不是依赖具体实现。面向接口编程,降低模块之间耦合,便于单元测试与替换实现。 - 接口隔离原则(ISP)
客户端不应该被迫依赖自己不需要的接口。把大而臃肿的接口拆分成多个细粒度的专用小接口,避免类实现一堆无用方法。 - 迪米特法则(最少知道原则)
一个对象尽量少和其他对象发生交互,只和直接相关对象通信。减少对象之间互相依赖,降低系统复杂度。 - 合成复用原则
优先使用组合/聚合实现复用,谨慎使用继承。继承是强耦合关系,组合方式更加灵活,降低类与类之间绑定关系。
注意:六大原则是指导思想,不是强制硬性规定。实际开发中要权衡取舍,不能为了满足原则而过度设计。
四、23种设计模式三大分类
GoF23种模式按照职责分为创建型、结构型、行为型三大类。
1. 创建型模式(5种)
核心关注点:对象如何创建,将对象创建和业务使用分离,屏蔽对象创建细节。
- 单例模式
- 工厂方法模式
- 抽象工厂模式
- 建造者模式
- 原型模式
2. 结构型模式(7种)
核心关注点:类与对象如何组合、装配,通过组合得到更强大的功能。
- 适配器模式
- 桥接模式
- 组合模式
- 装饰器模式
- 外观模式
- 享元模式
- 代理模式
3. 行为型模式(11种)
核心关注点:对象之间如何交互、职责如何分配,处理算法、流程、消息通知等行为逻辑。
- 责任链模式
- 命令模式
- 解释器模式
- 迭代器模式
- 中介者模式
- 备忘录模式
- 观察者模式
- 状态模式
- 策略模式
- 模板方法模式
- 访问者模式
五、学习设计模式的误区
- ❌ 不要死记硬背定义和UML图,重点理解解决什么问题、适用场景、优缺点。
- ❌ 不要为了用模式而硬套模式。简单业务强行上模式,会增加代码复杂度,造成过度设计。
- ✅ 先识别业务痛点,再匹配对应的模式;同一个业务场景,可能有多种模式可以实现。
- ✅ 结合框架源码学习:很多框架大量使用设计模式,阅读源码可以加深理解。
六、本系列后续规划
本系列会逐个拆解23种设计模式,每一篇包含:
- 模式定义与核心意图
- 解决的问题、适用场景
- Java代码示例
- 优缺点分析
- 实际项目/框架中的应用案例
0 条笔记