🧩 第六章 重用:OOP带来的软件重用和思想重用
📄 一句话概括

三种模式的最小骨架加起来只有 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 秒实验

  1. 找一个你写过三次以上 if 判断的地方,看能不能用策略替掉。
  2. 数一数你项目里【造对象】的代码分散在几处,看该不该收个工厂。

常见误区

  1. 以为模式是高级技巧,要背 23 个。它是给常见写法起名字。
  2. 以为用了模式就专业。不会变的地方套模式,只是多一层。
自测三问(点开对答案) 1. 设计模式是什么? —— 把老手重复用过的写法起了名字——价值在沟通,是词汇不是代码。 2. 三种最小骨架各几行、干什么? —— 策略 3 行(算法可换,实测 80.0)、工厂 2 行(造哪个类收口,实测 Circle)、观察者 8 行(一变通知一排,实测 [7]),合计 13 行。 3. 它们的共同点和滥用风险是什么? —— 共同点是把要变的那一点单独拎出来;风险是不会变的地方套模式,只多一层——不加它将来改一处就够,就别加。

相关笔记