装饰模式(Decorator Pattern)

非常好!现在我们来深入讲解装饰模式(Decorator Pattern) ,这是一个非常实用、优雅的结构型设计模式 ,在 Python 中用得特别广泛(比如 @装饰器语法)。


🧠 一句话定义

装饰模式允许你在不修改对象结构的前提下,动态地增强对象功能


🎯 为什么需要装饰模式?

传统做法是通过继承来扩展功能:

python 复制代码
class A:
    def feature()...

class B(A):
    def feature()...

但继承的问题是:

  • 🔴 不灵活(只能提前写死)
  • 🔴 类爆炸(每种组合都要继承一个新类)

✅ 装饰模式用组合(has-a)+ 包装 替代继承,让你可以随时"包一层功能"


✅ 优点 vs ❌ 缺点

✅ 优点 ❌ 缺点
动态组合功能(灵活) 多层嵌套调试困难
避免子类爆炸 对初学者理解稍难
满足开闭原则(可扩展功能) 包装类过多时结构复杂

🐍 Python 示例:咖啡点单系统(功能叠加)


☕ Step 1️⃣:定义饮品的接口(Component 抽象类)

python 复制代码
from abc import ABC, abstractmethod

class Drink(ABC):
    @abstractmethod
    def cost(self):
        pass

    @abstractmethod
    def description(self):
        pass

☕ Step 2️⃣:基础饮品类(Concrete Component)

python 复制代码
class Coffee(Drink):
    def cost(self):
        return 10  # 基础咖啡价格

    def description(self):
        return "原味咖啡"

🧁 Step 3️⃣:装饰器基类(Decorator)

python 复制代码
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️⃣:具体装饰器(增加功能)

python 复制代码
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->叠加

python 复制代码
# 创建一个基础咖啡
drink = Coffee()

# 加牛奶
drink = Milk(drink)

# 再加糖
drink = Sugar(drink)

# 输出总价和描述
print(f"你点的是: {drink.description()}")
print(f"总价是: {drink.cost()} 元")

✅ 输出结果:

复制代码
你点的是: 原味咖啡 + 牛奶 + 糖
总价是: 13 元

🧭 类图结构图(Mermaid)

<<interface>> Drink +cost() +description() Coffee +cost() +description() DrinkDecorator -Drink _drink +cost() +description() Milk Sugar


🔁 调用流程图(Mermaid)

Client Coffee Milk Sugar cost() = 10 包装 Coffee cost() = 10 ➕ 2 包装 Milk cost() = 12 ➕ 1 Client Coffee Milk Sugar


🧠 总结口诀

✅ 装饰模式:不动源对象,包一层加功能


🧩 应用场景

应用场景 示例
UI 控件增强 给按钮添加边框、阴影
数据处理链 日志记录 → 缓存 → 加密等操作链
订单计价系统 饮品 / 披萨 / 套餐的组合扩展

是否想继续深入下去,比如:

  • 使用 Python 内置 @decorator 实现?
  • 用函数式写法模拟装饰器类?
  • 将代码封装成插件系统结构?

我可以帮你再进一步优化或转换实战方向!是否继续?

相关推荐
lczdyx10 天前
从Flask到智能体:装饰器模式在AI系统中的架构迁移实践
人工智能·python·语言模型·架构·flask·装饰器模式
星星点点洲12 天前
【设计模式区别】装饰器模式和适配器模式区别
设计模式·适配器模式·装饰器模式
程序员JerrySUN23 天前
设计模式每日硬核训练 Day 12:装饰器模式(Decorator Pattern)完整讲解与实战应用
设计模式·装饰器模式
aiden:)25 天前
星巴克咖啡下单系统:UML 类图解析与代码实现
设计模式·软件工程·uml·装饰器模式
〆、风神1 个月前
装饰器模式与模板方法模式实现MyBatis-Plus QueryWrapper 扩展
mybatis·装饰器模式·模板方法模式
qq_529835351 个月前
装饰器模式:如何用Java打扮一个对象?
java·开发语言·装饰器模式
搞不懂语言的程序员1 个月前
装饰器模式详解
开发语言·python·装饰器模式
NorthCastle2 个月前
设计模式-结构型模式-装饰器模式
设计模式·装饰器模式
lina_mua2 个月前
前端开发中的设计模式:装饰器模式的应用与实践
设计模式·装饰器模式