设计模式与原则:构建可扩展代码的经典之道
软件设计是一门艺术,而设计模式和原则是这门艺术的语法。它们不是教条,而是经过时间检验的智慧结晶。
为什么设计模式重要?
想象一下,你在盖房子。每一块砖自己堆叠,最终只能是一堵墙。但如果你懂得使用不同的砌法——砖混结构、框架结构、钢结构——你就能建出摩天大楼。
设计模式就是这样一套"建筑语法"。它们是:
- 已解决的问题 — 前人已经踩过的坑,总结出的解决方案
- 通用的词汇 — 让你和团队高效沟通
- 经过验证的实践 — 无数项目验证过的最佳实践
核心设计原则:SOLID
| 原则 | 全称 | 解释 |
|---|---|---|
| S | 单一职责 | 一个类只做一件事 |
| O | 开闭原则 | 对扩展开放,对修改封闭 |
| L | 里氏替换 | 子类可以替换父类 |
| I | 接口隔离 | 不要依赖不需要的接口 |
| D | 依赖倒置 | 依赖抽象而非具体 |
23种经典设计模式
分为三类:
- 创建型(5种):Singleton、Factory、Abstract Factory、Builder、Prototype
- 结构型(7种):Adapter、Bridge、Composite、Decorator、Facade、Flyweight、Proxy
- 行为型(11种):Chain of Responsibility、Command、Iterator、Mediator、Memento、Observer、State、Strategy、Template Method、Visitor
最常用的5种模式
1. 单例模式(Singleton)
确保一个类只有一个实例。适用:配置管理、日志、连接池。
2. 工厂方法模式(Factory Method)
定义创建对象的接口,让子类决定实例化哪个类。适用:支付方式、通知渠道。
3. 观察者模式(Observer)
定义一对多依赖,当对象变化时通知所有依赖者。适用:事件系统、消息推送。
4. 装饰器模式(Decorator)
动态添加职责。适用:中间件、拦截器、日志。
5. 策略模式(Strategy)
定义一系列算法,封装起来使它们可以互换。适用:压缩算法、排序算法。
如何选择正确的模式?
问自己三个问题
- 你在解决什么问题? 创建/结构/行为
- 问题会变化吗? 会变化用策略、装饰器
- 代码会膨胀吗? 会膨胀→分解职责
反模式警告
不要为了用模式而用模式。如果一行代码能解决,不要用五个类。
实践建议
- 从问题出发 — 遇到问题→思考是否已有模式→没有再创新
- 小步重构 — 先写能工作的代码→识别重复→提炼模式
- 团队共识 — 在团队内建立模式语言
Design is not just what it looks like and feels like. Design is how it works. — Steve Jobs
Happy Coding! 🚀
Top comments (1)
很喜欢这个总结,尤其是把设计模式类比成“建筑语法”,非常形象。
很多初学者一开始把设计模式当成“必须背的清单”,但实际工作中更像是“在踩坑后突然想起:哦,这里其实有现成解法” 😄
SOLID原则这一块也很关键,本质上是在控制复杂度的增长速度,而不是一开始就追求完美设计。
我通常的经验是:当你开始复制粘贴代码第三次的时候,设计模式就已经在敲门了。
另外很认同反模式的提醒——过度设计比没有设计更难维护,尤其是那种“五个类解决一个if判断”的情况。
策略模式和装饰器在实际项目中确实非常常见,特别是在做可扩展系统或者中间件设计时,几乎是“默认选项”。
不过也有个有趣的现象:很多人讨厌单例模式,直到他们开始写配置管理或者连接池 😅
我觉得最好的学习路径还是你提到的:先写能跑的代码,再逐步重构出模式,而不是一开始就“套模板”。
总体来说,这篇更像是一个很好的“思维地图”,而不是教条指南,这一点非常加分。