一、设计模式到底是什么?
说实话,我刚开始学编程那会儿,听到「设计模式」这四个字,总觉得是某种高深莫测的武功秘籍。后来踩了不少坑,才慢慢明白——设计模式其实就是前辈们总结出来的、解决特定问题的套路。
你想想看,写代码和盖房子其实差不多。盖房子有标准图纸,写代码也有标准解法。设计模式就是这些标准解法的集合。我个人习惯把它理解成「代码世界的兵法」——不是让你死记硬背,而是让你在遇到问题时知道该用哪一招。
设计模式的定义:在特定场景下,针对反复出现的问题,给出的可复用的解决方案。
注意三个关键词:场景、反复出现、可复用。说白了,不是所有问题都需要设计模式,只有那些你遇到过很多次、而且别人也遇到过很多次的问题,才值得用模式去解决。
二、GoF 23种设计模式分类
1994年,四位大佬(Erich Gamma、Richard Helm、Ralph Johnson、John Vlissides)合写了一本书,叫《设计模式:可复用面向对象软件的基础》。这本书里总结了23种设计模式,后人称之为GoF 23种设计模式。
这23种模式按用途分成三大类:
1. 创建型模式(5种)
这类模式关注的是「怎么把对象创建出来」。我在项目中遇到过不少因为new对象太随意导致的耦合问题,后来用工厂模式一重构,整个世界都清爽了。
| 模式名称 | 一句话说明 |
|---|---|
| 单例模式 | 保证一个类只有一个实例 |
| 工厂方法 | 定义一个创建对象的接口,让子类决定实例化哪个类 |
| 抽象工厂 | 创建一组相关或依赖的对象 |
| 建造者模式 | 分步骤构建复杂对象 |
| 原型模式 | 通过复制现有对象来创建新对象 |
2. 结构型模式(7种)
这类模式关注的是「类和对象怎么组合成更大的结构」。我记得有一次做系统重构,类之间的关系乱成一团麻,用了适配器模式和代理模式之后,代码的清晰度提升了好几个档次。
| 模式名称 | 一句话说明 |
|---|---|
| 适配器模式 | 让不兼容的接口能一起工作 |
| 桥接模式 | 将抽象部分与实现部分分离 |
| 组合模式 | 将对象组合成树形结构 |
| 装饰器模式 | 动态给对象添加新功能 |
| 外观模式 | 为子系统提供统一的高层接口 |
| 享元模式 | 共享细粒度对象,减少内存占用 |
| 代理模式 | 为其他对象提供一种代理以控制访问 |
3. 行为型模式(11种)
这类模式关注的是「对象之间的职责分配和通信」。嗯,这里要特别说一下,行为型模式是23种里最多的,也是最容易在实际项目中用到的。
| 模式名称 | 一句话说明 |
|---|---|
| 责任链模式 | 多个对象依次处理同一个请求 |
| 命令模式 | 将请求封装成对象 |
| 解释器模式 | 定义语言的文法并解释句子 |
| 迭代器模式 | 提供顺序访问集合元素的方法 |
| 中介者模式 | 用一个中介对象封装对象间的交互 |
| 备忘录模式 | 保存对象状态以便恢复 |
| 观察者模式 | 一对多依赖,状态变化时通知所有观察者 |
| 状态模式 | 对象行为随内部状态改变而改变 |
| 策略模式 | 定义一系列算法,把它们封装起来 |
| 模板方法模式 | 定义算法骨架,子类实现具体步骤 |
| 访问者模式 | 在不改变元素类的前提下定义新操作 |
三、为什么要学设计模式?
这个问题我经常被问到。说实话,我刚开始也觉得设计模式是「屠龙之术」,平时写业务代码根本用不上。但后来我慢慢发现,不是用不上,而是你没意识到可以用。
1. 提升代码的可维护性
我曾经接手过一个项目,一个类里面写了3000多行代码,if-else嵌套了七八层。改一个需求要翻半天代码,还经常改出bug。后来用策略模式重构了一下,代码量直接砍掉一半,每个策略类也就几十行。你想想看,哪种代码更容易维护?
2. 提高团队沟通效率
「这里用个观察者模式」「那边加个适配器」——几句话就能说清楚的设计思路,如果没有设计模式这个词汇,你得画半天图、写一堆注释。设计模式就是程序员之间的「行话」,懂了之后沟通效率翻倍。
3. 避免重复造轮子
很多框架和中间件本身就是设计模式的实践。比如Spring用了大量的工厂模式、代理模式、模板方法模式。你懂了设计模式,看源码的时候就不会一头雾水,反而能看出作者的设计意图。
我的建议:不要为了用模式而用模式。设计模式是工具,不是目的。在合适的场景用合适的模式,才是高手。
避坑指南:我曾经见过一个项目,为了「优雅」硬套了七八种设计模式,结果代码变得极其复杂,新人根本看不懂。记住:简单才是王道,过度设计比没有设计更可怕。
四、怎么学设计模式?
我个人习惯分三步走:
- 先理解概念:每个模式解决什么问题?适用场景是什么?
- 再看代码示例:不要只看理论,一定要动手写一遍。我建议用Java写,因为GoF的经典示例就是Java写的。
- 最后应用到项目:在真实项目中找机会用。哪怕只是重构一小段代码,也比看十遍书有用。
嗯,这里要注意一点:不要贪多。一天学一个模式,23天学完,然后花半年时间消化,效果远比一周囫囵吞枣要好。
好了,这一章就到这里。设计模式入门其实不难,关键是你要有「模式思维」——遇到问题先想想:这个问题有没有现成的解法?别人是怎么解决的?有了这个意识,你就已经走在正确的路上了。
公众号:蓝海资料掘金营,微信deep3321