预计阅读 5 分钟1959 字4 次浏览

设计模式修炼之路 ① 初识设计模式——先把地图摊开

这是系列的第一篇,没有一行代码:设计模式是什么、模式分哪四大家族、六大原则长什么样。先把地图摊开,路从下一篇开始走。

目录

这是系列的第一篇,没有一行代码:设计模式是什么、模式分哪四大家族、六大原则长什么样。先把地图摊开,路从下一篇开始走。

刚写代码那几年,听得最多的一句忠告是"降低耦合"。降低耦合降低耦合降低耦合——听了一百遍,落到键盘上还是不知道从哪儿下手。直到某天接手一个三千行的 Service,一个方法里 if-else 套了六层,想加个小功能却牵一发动全身,我才真正明白:耦合不是靠喊的,是靠设计的。设计模式,就是前人把"怎么设计"这件事按场景总结出来的一套套可复用的解法。

这个系列是一份修炼记录:从单例开始,创建型、结构型、行为型、J2EE 一路练过去,每个模式配一套能直接编译运行的代码,讲清楚它解决什么问题、有什么代价。这一篇是开篇,只摊地图,不上代码。

一、什么是设计模式

一句话版本:设计模式是针对特定场景、经过反复验证的经典解法。

拆开是三层意思:

  1. 针对特定场景。每个模式都有它要解决的问题——单例解决"只该有一份",工厂解决"实例从哪来",观察者解决"一处变化、多方得知"。脱离问题谈模式,就是屠龙之技。
  2. 经过反复验证。模式不是哪个大牛拍脑袋的灵感,而是无数项目踩坑踩出来的公约数。1994 年 GoF 四人组的《设计模式:可复用面向对象软件的基础》整理了 23 个,从此成了这个领域的通用语。
  3. 是套路,不是银弹。用对了是杠杆,用错了是枷锁——不问场景硬套模式,比不用还糟。这个系列会反复念叨一句话:先有问题,再有模式。

学它图什么?往大了说,代码可复用、可扩展、好维护;往小了说,它给团队一套共同语言——一句"这里用策略模式",顶得上十分钟的手舞足蹈。

二、四大分类与系列路线图

GoF 的 23 个模式按"管什么"分成三族;工程里常用的 J2EE 表现层模式,算第四族。这个系列在 GoF 之外顺带练了过滤器、空对象两个常见"编外"模式,再加 8 个 J2EE 模式,一共 33 个:

分类 管什么 本系列篇目
创建型(5 种) 对象怎么"造"——造几个、从哪造、怎么造得舒坦 ② 单例、③ 工厂(含抽象工厂)、④ 建造者、⑤ 原型
结构型(8 种) 类和对象怎么"组装"——小结构拼成大结构 ⑥ 适配器、⑦ 桥接、⑧ 过滤器、⑨ 组合、⑩ 装饰器、⑪ 外观、⑫ 享元、⑬ 代理
行为型(12 种) 职责怎么"分"、消息怎么"传" ⑭ 模板、⑮ 策略、⑯ 观察者、⑰ 责任链、⑱ 命令、⑲ 状态、⑳ 迭代器、㉑ 备忘录、㉒ 中介者、㉓ 空对象、㉔ 访问者、㉕ 解释器
J2EE(8 种) 表现层的老朋友 ㉖ MVC、㉗ 业务代表、㉘ 组合实体、㉙ DAO、㉚ 前端控制器、㉛ 拦截过滤器、㉜ 服务定位器、㉝ 传输对象

表里的顺序就是建议的阅读顺序:创建型打底,先把对象的生老病死搞清楚;结构型和行为型经常回头引用前面的套路;J2EE 收常见框架背后的模式。全部走完,㉞ 收官篇用六大原则算总账。

三、六大原则速览

模式有 33 个,原则只有六条。打个比方:模式是判例,原则是法律——每个模式背后,都是某几条原则的具体化。

先请两条祖训压阵,GoF 那本红皮书开篇立的:面向接口编程,而不是面向实现;组合优于继承。六大原则,差不多就是这两条祖训加上开闭原则的展开版:

原则 一句话版本
单一职责 一个类只因一个原因变——只干一件事
开闭原则 对扩展开放,对修改关闭
里氏替换 子类必须能无痛替换父类,继承不是白拿的
依赖倒置 依赖抽象,不依赖具体实现
接口隔离 接口要小而专,别逼实现方背用不到的方法
迪米特法则 只和直接朋友说话,别跟陌生人套近乎

不少教材还会加第七条"合成复用"(多用组合、少用继承),凑成七大原则。本系列按六条走——合成复用就当"组合优于继承"那条祖训的镜像,在结构型那几篇里它会反复出场。

第一次看,这六行就是六行字,背了就忘,很正常。先混个脸熟就好:后面三十多篇里,它们会一个一个从字里行间站起来——下一篇的单例就会先撞上开闭和单一职责两堵墙,收官篇我们再回头逐条算总账。到那时候,每一行背后都是一路踩过的坑。

四、这个系列怎么练

三条姿势建议:

  1. 先问"它解决什么问题",再看 UML。记不住类图不影响使用,看不懂意图等于白学。每篇都尽量从"不这么写会怎样"讲起。
  2. 代码要跑。光看是学不会骑车的。示例代码统一放在 design-pattern 项目里,一个模式一个包,系列里每一篇的输出都来自实际运行,可以直接复现。
  3. 警惕模式上瘾。两三百行的小工具类硬拆出策略+工厂+观察者,这不叫设计,叫行为艺术。模式是给"会变化的地方"上保险的——先判断哪里会变,再决定用不用。

写在最后

这一篇没有代码,摊开的是地图:33 个模式四个家族,六条原则两条祖训。

从下一篇起,示例代码都在 design-pattern 项目里按模式分包维护,文中输出全部来自实际运行,可直接复现。

下一篇,从创建型里最简单也最骗人的一个开始——单例模式:一个类在整个应用里只允许一个实例,听着像一句话需求,落实起来能折腾出六种写法,一把锁能玩出两层判断。路上见。

花

花开空白

开发者 · 西安

相关文章

评论(0)

还没有评论,来抢沙发吧

发表评论