📄 一句话概括
三种模式的最小骨架加起来只有 13 行——模式本身很小,值钱的是【知道什么时候用它】。
📝 本节和前面几节的关系
6.8 讲怎么挑构件,这一节讲比构件更轻的复用:复用别人的设计想法。
一、模式是什么
不是新发明,是把老手重复用过的写法起了名字。 名字的价值在于【沟通】:说【这里用策略】,对方立刻知道你把可变的算法抽出去了。 所以模式是词汇,不是代码。
二、三种最小骨架
策略(3 行):把可变的算法做成可替换的东西——实测 {普通: x, 打折: x*0.8}[kind](100) 得 80.0。
工厂(2 行):把【造哪个类】收进一个地方——实测得到 Circle。
观察者(8 行):变了就通知一排订阅者——实测通知到 [7]。
合计 13 行。
三、它们的共同点
都把【要变的那一点】单独拎出来,其余部分不动。 策略拎出算法、工厂拎出构造、观察者拎出通知。 这正是 4.19 说的决心:现在多写一层,将来改的时候不动主干。
四、别滥用
13 行能解决的事,别上三层抽象。 模式的前提是【那一点真的会变】——不会变的地方套模式,只是多了一层。 判断标准:不加这层,将来改一次要动几处?答案是 1 处,就别加。
五、动手 Demo:设计模式是优秀的设计思想集
写三个最小骨架:策略、工厂、观察者。 数一数各几行,看模式本身到底有多大。
# 策略:把可变的算法做成可替换的
def strategy(kind):
table = {"普通": lambda x: x, "打折": lambda x: x * 0.8}
return table[kind](100)
# 工厂:把造哪个类收进一个地方
def factory(kind, *args):
return {"矩形": Rect, "圆": Circle}[kind](*args)
# 观察者:变了就通知一排
class Subject:
def __init__(self): self.subs = []
def sub(self, fn): self.subs.append(fn)
def fire(self, v):
for fn in self.subs: fn(v)
实跑输出:
--------------------------------------------------------------------
设计模式是优秀的设计思想集
--------------------------------------------------------------------
设计模式不是新发明,**是把老手重复用过的写法起了名字。**实测三种最小骨架:
模式 解决什么 骨架几行 实测结果
----------------------------------------------------
策略 算法要能换 3 80.0
工厂 造哪个类要收口 2 Circle
观察者 一变通知一排 8 [7]
三种模式骨架合计 13 行
**三种模式骨架加起来 13 行**——**模式本身很小,值钱的是【知道什么时候用它】。**
**它们的共同点:把【要变的那一点】单独拎出来,其余部分不动。**
**所以模式是【设计思想】,不是【代码模板】。**
实测:策略 3 行、工厂 2 行、观察者 8 行,合计 13 行。 模式本身很小,值钱的是【知道什么时候用它】——共同点都是把要变的那一点单独拎出来。
30 秒实验
- 找一个你写过三次以上 if 判断的地方,看能不能用策略替掉。
- 数一数你项目里【造对象】的代码分散在几处,看该不该收个工厂。
常见误区
- 以为模式是高级技巧,要背 23 个。它是给常见写法起名字。
- 以为用了模式就专业。不会变的地方套模式,只是多一层。
自测三问(点开对答案)
1. 设计模式是什么? —— 把老手重复用过的写法起了名字——价值在沟通,是词汇不是代码。 2. 三种最小骨架各几行、干什么? —— 策略 3 行(算法可换,实测 80.0)、工厂 2 行(造哪个类收口,实测 Circle)、观察者 8 行(一变通知一排,实测 [7]),合计 13 行。 3. 它们的共同点和滥用风险是什么? —— 共同点是把要变的那一点单独拎出来;风险是不会变的地方套模式,只多一层——不加它将来改一处就够,就别加。- ☐ 下一节(6.10 设计模式是类库探险的路标)
相关笔记
- 设计模式是类库探险的路标 — 模式怎么帮你读类库
- 决心决定OOP的生死 — 现在多写一层的账
- ☕ Java基础 · 索引 — 常见设计模式的实现
- 🧩 面向对象是怎样工作的 · 索引