一、设计模式到底是什么?

说实话,我刚开始学编程那会儿,听到「设计模式」这四个字,总觉得是某种高深莫测的武功秘籍。后来踩了不少坑,才慢慢明白——设计模式其实就是前辈们总结出来的、解决特定问题的套路

你想想看,写代码和盖房子其实差不多。盖房子有标准图纸,写代码也有标准解法。设计模式就是这些标准解法的集合。我个人习惯把它理解成「代码世界的兵法」——不是让你死记硬背,而是让你在遇到问题时知道该用哪一招。

设计模式的定义:在特定场景下,针对反复出现的问题,给出的可复用的解决方案。

注意三个关键词:场景反复出现可复用。说白了,不是所有问题都需要设计模式,只有那些你遇到过很多次、而且别人也遇到过很多次的问题,才值得用模式去解决。

二、GoF 23种设计模式分类

1994年,四位大佬(Erich Gamma、Richard Helm、Ralph Johnson、John Vlissides)合写了一本书,叫《设计模式:可复用面向对象软件的基础》。这本书里总结了23种设计模式,后人称之为GoF 23种设计模式

这23种模式按用途分成三大类:

1. 创建型模式(5种)

这类模式关注的是「怎么把对象创建出来」。我在项目中遇到过不少因为new对象太随意导致的耦合问题,后来用工厂模式一重构,整个世界都清爽了。

模式名称 一句话说明
单例模式 保证一个类只有一个实例
工厂方法 定义一个创建对象的接口,让子类决定实例化哪个类
抽象工厂 创建一组相关或依赖的对象
建造者模式 分步骤构建复杂对象
原型模式 通过复制现有对象来创建新对象

2. 结构型模式(7种)

这类模式关注的是「类和对象怎么组合成更大的结构」。我记得有一次做系统重构,类之间的关系乱成一团麻,用了适配器模式和代理模式之后,代码的清晰度提升了好几个档次。

模式名称 一句话说明
适配器模式 让不兼容的接口能一起工作
桥接模式 将抽象部分与实现部分分离
组合模式 将对象组合成树形结构
装饰器模式 动态给对象添加新功能
外观模式 为子系统提供统一的高层接口
享元模式 共享细粒度对象,减少内存占用
代理模式 为其他对象提供一种代理以控制访问

3. 行为型模式(11种)

这类模式关注的是「对象之间的职责分配和通信」。嗯,这里要特别说一下,行为型模式是23种里最多的,也是最容易在实际项目中用到的。

模式名称 一句话说明
责任链模式 多个对象依次处理同一个请求
命令模式 将请求封装成对象
解释器模式 定义语言的文法并解释句子
迭代器模式 提供顺序访问集合元素的方法
中介者模式 用一个中介对象封装对象间的交互
备忘录模式 保存对象状态以便恢复
观察者模式 一对多依赖,状态变化时通知所有观察者
状态模式 对象行为随内部状态改变而改变
策略模式 定义一系列算法,把它们封装起来
模板方法模式 定义算法骨架,子类实现具体步骤
访问者模式 在不改变元素类的前提下定义新操作
GoF 23种设计模式分类 创建型(5种) 结构型(7种) 行为型(11种) 单例模式 工厂方法 抽象工厂 建造者模式 原型模式 适配器模式 桥接模式 组合模式 装饰器模式 外观模式 享元模式 代理模式 责任链模式 命令模式 解释器模式 迭代器模式 中介者模式 备忘录模式 观察者模式 状态模式 策略模式 模板方法模式 访问者模式

三、为什么要学设计模式?

这个问题我经常被问到。说实话,我刚开始也觉得设计模式是「屠龙之术」,平时写业务代码根本用不上。但后来我慢慢发现,不是用不上,而是你没意识到可以用

1. 提升代码的可维护性

我曾经接手过一个项目,一个类里面写了3000多行代码,if-else嵌套了七八层。改一个需求要翻半天代码,还经常改出bug。后来用策略模式重构了一下,代码量直接砍掉一半,每个策略类也就几十行。你想想看,哪种代码更容易维护?

2. 提高团队沟通效率

「这里用个观察者模式」「那边加个适配器」——几句话就能说清楚的设计思路,如果没有设计模式这个词汇,你得画半天图、写一堆注释。设计模式就是程序员之间的「行话」,懂了之后沟通效率翻倍。

3. 避免重复造轮子

很多框架和中间件本身就是设计模式的实践。比如Spring用了大量的工厂模式、代理模式、模板方法模式。你懂了设计模式,看源码的时候就不会一头雾水,反而能看出作者的设计意图。

我的建议:不要为了用模式而用模式。设计模式是工具,不是目的。在合适的场景用合适的模式,才是高手。

避坑指南:我曾经见过一个项目,为了「优雅」硬套了七八种设计模式,结果代码变得极其复杂,新人根本看不懂。记住:简单才是王道,过度设计比没有设计更可怕。

四、怎么学设计模式?

我个人习惯分三步走:

  1. 先理解概念:每个模式解决什么问题?适用场景是什么?
  2. 再看代码示例:不要只看理论,一定要动手写一遍。我建议用Java写,因为GoF的经典示例就是Java写的。
  3. 最后应用到项目:在真实项目中找机会用。哪怕只是重构一小段代码,也比看十遍书有用。

嗯,这里要注意一点:不要贪多。一天学一个模式,23天学完,然后花半年时间消化,效果远比一周囫囵吞枣要好。

好了,这一章就到这里。设计模式入门其实不难,关键是你要有「模式思维」——遇到问题先想想:这个问题有没有现成的解法?别人是怎么解决的?有了这个意识,你就已经走在正确的路上了。


公众号:蓝海资料掘金营,微信deep3321