设计模式修炼之路 ① 初识设计模式——先把地图摊开
这是系列的第一篇,没有一行代码:设计模式是什么、模式分哪四大家族、六大原则长什么样。先把地图摊开,路从下一篇开始走。
这是系列的第一篇,没有一行代码:设计模式是什么、模式分哪四大家族、六大原则长什么样。先把地图摊开,路从下一篇开始走。
刚写代码那几年,听得最多的一句忠告是"降低耦合"。降低耦合降低耦合降低耦合——听了一百遍,落到键盘上还是不知道从哪儿下手。直到某天接手一个三千行的 Service,一个方法里 if-else 套了六层,想加个小功能却牵一发动全身,我才真正明白:耦合不是靠喊的,是靠设计的。设计模式,就是前人把"怎么设计"这件事按场景总结出来的一套套可复用的解法。
这个系列是一份修炼记录:从单例开始,创建型、结构型、行为型、J2EE 一路练过去,每个模式配一套能直接编译运行的代码,讲清楚它解决什么问题、有什么代价。这一篇是开篇,只摊地图,不上代码。
一、什么是设计模式
一句话版本:设计模式是针对特定场景、经过反复验证的经典解法。
拆开是三层意思:
- 针对特定场景。每个模式都有它要解决的问题——单例解决"只该有一份",工厂解决"实例从哪来",观察者解决"一处变化、多方得知"。脱离问题谈模式,就是屠龙之技。
- 经过反复验证。模式不是哪个大牛拍脑袋的灵感,而是无数项目踩坑踩出来的公约数。1994 年 GoF 四人组的《设计模式:可复用面向对象软件的基础》整理了 23 个,从此成了这个领域的通用语。
- 是套路,不是银弹。用对了是杠杆,用错了是枷锁——不问场景硬套模式,比不用还糟。这个系列会反复念叨一句话:先有问题,再有模式。
学它图什么?往大了说,代码可复用、可扩展、好维护;往小了说,它给团队一套共同语言——一句"这里用策略模式",顶得上十分钟的手舞足蹈。
二、四大分类与系列路线图
GoF 的 23 个模式按"管什么"分成三族;工程里常用的 J2EE 表现层模式,算第四族。这个系列在 GoF 之外顺带练了过滤器、空对象两个常见"编外"模式,再加 8 个 J2EE 模式,一共 33 个:
| 分类 | 管什么 | 本系列篇目 |
|---|---|---|
| 创建型(5 种) | 对象怎么"造"——造几个、从哪造、怎么造得舒坦 | ② 单例、③ 工厂(含抽象工厂)、④ 建造者、⑤ 原型 |
| 结构型(8 种) | 类和对象怎么"组装"——小结构拼成大结构 | ⑥ 适配器、⑦ 桥接、⑧ 过滤器、⑨ 组合、⑩ 装饰器、⑪ 外观、⑫ 享元、⑬ 代理 |
| 行为型(12 种) | 职责怎么"分"、消息怎么"传" | ⑭ 模板、⑮ 策略、⑯ 观察者、⑰ 责任链、⑱ 命令、⑲ 状态、⑳ 迭代器、㉑ 备忘录、㉒ 中介者、㉓ 空对象、㉔ 访问者、㉕ 解释器 |
| J2EE(8 种) | 表现层的老朋友 | ㉖ MVC、㉗ 业务代表、㉘ 组合实体、㉙ DAO、㉚ 前端控制器、㉛ 拦截过滤器、㉜ 服务定位器、㉝ 传输对象 |
表里的顺序就是建议的阅读顺序:创建型打底,先把对象的生老病死搞清楚;结构型和行为型经常回头引用前面的套路;J2EE 收常见框架背后的模式。全部走完,㉞ 收官篇用六大原则算总账。
三、六大原则速览
模式有 33 个,原则只有六条。打个比方:模式是判例,原则是法律——每个模式背后,都是某几条原则的具体化。
先请两条祖训压阵,GoF 那本红皮书开篇立的:面向接口编程,而不是面向实现;组合优于继承。六大原则,差不多就是这两条祖训加上开闭原则的展开版:
| 原则 | 一句话版本 |
|---|---|
| 单一职责 | 一个类只因一个原因变——只干一件事 |
| 开闭原则 | 对扩展开放,对修改关闭 |
| 里氏替换 | 子类必须能无痛替换父类,继承不是白拿的 |
| 依赖倒置 | 依赖抽象,不依赖具体实现 |
| 接口隔离 | 接口要小而专,别逼实现方背用不到的方法 |
| 迪米特法则 | 只和直接朋友说话,别跟陌生人套近乎 |
不少教材还会加第七条"合成复用"(多用组合、少用继承),凑成七大原则。本系列按六条走——合成复用就当"组合优于继承"那条祖训的镜像,在结构型那几篇里它会反复出场。
第一次看,这六行就是六行字,背了就忘,很正常。先混个脸熟就好:后面三十多篇里,它们会一个一个从字里行间站起来——下一篇的单例就会先撞上开闭和单一职责两堵墙,收官篇我们再回头逐条算总账。到那时候,每一行背后都是一路踩过的坑。
四、这个系列怎么练
三条姿势建议:
- 先问"它解决什么问题",再看 UML。记不住类图不影响使用,看不懂意图等于白学。每篇都尽量从"不这么写会怎样"讲起。
- 代码要跑。光看是学不会骑车的。示例代码统一放在 design-pattern 项目里,一个模式一个包,系列里每一篇的输出都来自实际运行,可以直接复现。
- 警惕模式上瘾。两三百行的小工具类硬拆出策略+工厂+观察者,这不叫设计,叫行为艺术。模式是给"会变化的地方"上保险的——先判断哪里会变,再决定用不用。
写在最后
这一篇没有代码,摊开的是地图:33 个模式四个家族,六条原则两条祖训。
从下一篇起,示例代码都在 design-pattern 项目里按模式分包维护,文中输出全部来自实际运行,可直接复现。
下一篇,从创建型里最简单也最骗人的一个开始——单例模式:一个类在整个应用里只允许一个实例,听着像一句话需求,落实起来能折腾出六种写法,一把锁能玩出两层判断。路上见。