装饰模式(Decorator Pattern)
非常好!现在我们来深入讲解装饰模式(Decorator Pattern),这是一个非常实用、优雅的结构型设计模式,在 Python 中用得特别广泛(比如 @装饰器语法
)。
🧠 一句话定义
装饰模式允许你在不修改对象结构的前提下,动态地增强对象功能。
🎯 为什么需要装饰模式?
传统做法是通过继承来扩展功能:
class A:def feature()...class B(A):def feature()...
但继承的问题是:
- 🔴 不灵活(只能提前写死)
- 🔴 类爆炸(每种组合都要继承一个新类)
✅ 装饰模式用组合(has-a)+ 包装替代继承,让你可以随时“包一层功能”。
✅ 优点 vs ❌ 缺点
✅ 优点 | ❌ 缺点 |
---|---|
动态组合功能(灵活) | 多层嵌套调试困难 |
避免子类爆炸 | 对初学者理解稍难 |
满足开闭原则(可扩展功能) | 包装类过多时结构复杂 |
🐍 Python 示例:咖啡点单系统(功能叠加)
☕ Step 1️⃣:定义饮品的接口(Component 抽象类)
from abc import ABC, abstractmethodclass Drink(ABC):@abstractmethoddef cost(self):pass@abstractmethoddef description(self):pass
☕ Step 2️⃣:基础饮品类(Concrete Component)
class Coffee(Drink):def cost(self):return 10 # 基础咖啡价格def description(self):return "原味咖啡"
🧁 Step 3️⃣:装饰器基类(Decorator)
class DrinkDecorator(Drink):def __init__(self, drink: Drink):self._drink = drink # 组合基础饮品def cost(self):return self._drink.cost()def description(self):return self._drink.description()
🍬 Step 4️⃣:具体装饰器(增加功能)
class Milk(DrinkDecorator):def cost(self):return self._drink.cost() + 2 # 加牛奶加 2 元def description(self):return self._drink.description() + " + 牛奶"class Sugar(DrinkDecorator):def cost(self):return self._drink.cost() + 1 # 加糖加 1 元def description(self):return self._drink.description() + " + 糖"
🧪 Step 5️⃣:客户端使用示例(叠加装饰)
drink->drink->drink->叠加
# 创建一个基础咖啡
drink = Coffee()# 加牛奶
drink = Milk(drink)# 再加糖
drink = Sugar(drink)# 输出总价和描述
print(f"你点的是: {drink.description()}")
print(f"总价是: {drink.cost()} 元")
✅ 输出结果:
你点的是: 原味咖啡 + 牛奶 + 糖
总价是: 13 元
🧭 类图结构图(Mermaid)
🔁 调用流程图(Mermaid)
🧠 总结口诀
✅ 装饰模式:不动源对象,包一层加功能
🧩 应用场景
应用场景 | 示例 |
---|---|
UI 控件增强 | 给按钮添加边框、阴影 |
数据处理链 | 日志记录 → 缓存 → 加密等操作链 |
订单计价系统 | 饮品 / 披萨 / 套餐的组合扩展 |
是否想继续深入下去,比如:
- 使用 Python 内置
@decorator
实现? - 用函数式写法模拟装饰器类?
- 将代码封装成插件系统结构?
我可以帮你再进一步优化或转换实战方向!是否继续?