DEV Community

架构师小白
架构师小白

Posted on

设计模式与原则:构建可扩展代码的经典之道

设计模式与原则:构建可扩展代码的经典之道

软件设计是一门艺术,而设计模式和原则是这门艺术的语法。它们不是教条,而是经过时间检验的智慧结晶。

为什么设计模式重要?

想象一下,你在盖房子。每一块砖自己堆叠,最终只能是一堵墙。但如果你懂得使用不同的砌法——砖混结构、框架结构、钢结构——你就能建出摩天大楼。

设计模式就是这样一套"建筑语法"。它们是:

  1. 已解决的问题 — 前人已经踩过的坑,总结出的解决方案
  2. 通用的词汇 — 让你和团队高效沟通
  3. 经过验证的实践 — 无数项目验证过的最佳实践

核心设计原则: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)

定义一系列算法,封装起来使它们可以互换。适用:压缩算法、排序算法。

如何选择正确的模式?

问自己三个问题

  1. 你在解决什么问题? 创建/结构/行为
  2. 问题会变化吗? 会变化用策略、装饰器
  3. 代码会膨胀吗? 会膨胀→分解职责

反模式警告

不要为了用模式而用模式。如果一行代码能解决,不要用五个类。

实践建议

  1. 从问题出发 — 遇到问题→思考是否已有模式→没有再创新
  2. 小步重构 — 先写能工作的代码→识别重复→提炼模式
  3. 团队共识 — 在团队内建立模式语言

Design is not just what it looks like and feels like. Design is how it works. — Steve Jobs

Happy Coding! 🚀

Top comments (1)

Collapse
 
godaddy_llc_4e3a2f1804238 profile image
GoDaddy LLC

很喜欢这个总结,尤其是把设计模式类比成“建筑语法”,非常形象。

很多初学者一开始把设计模式当成“必须背的清单”,但实际工作中更像是“在踩坑后突然想起:哦,这里其实有现成解法” 😄

SOLID原则这一块也很关键,本质上是在控制复杂度的增长速度,而不是一开始就追求完美设计。

我通常的经验是:当你开始复制粘贴代码第三次的时候,设计模式就已经在敲门了。

另外很认同反模式的提醒——过度设计比没有设计更难维护,尤其是那种“五个类解决一个if判断”的情况。

策略模式和装饰器在实际项目中确实非常常见,特别是在做可扩展系统或者中间件设计时,几乎是“默认选项”。

不过也有个有趣的现象:很多人讨厌单例模式,直到他们开始写配置管理或者连接池 😅

我觉得最好的学习路径还是你提到的:先写能跑的代码,再逐步重构出模式,而不是一开始就“套模板”。

总体来说,这篇更像是一个很好的“思维地图”,而不是教条指南,这一点非常加分。