当前位置: 首页 > news >正文

装饰器模式(Decorator)

在开发中,你是否遇到过这样的需求:

  • 给函数增加日志
  • 给接口增加权限校验
  • 给方法增加缓存
  • 给对象增加额外功能

但你又不想:

  • 修改原有类
  • 破坏原有逻辑
  • 使用大量继承

这时候就轮到 ——装饰器模式


一、装饰器模式解决什么问题?

一句话:

在不修改原对象结构的情况下,动态地给对象增加额外功能。

关键词:

  • 动态增强
  • 不修改原类
  • 不使用继承扩展

二、一个不用装饰器的“笨办法”

假设有一个通知类:

classNotifier:defsend(self,message):print(f"发送消息:{message}")

现在要增加“日志功能”。

很多人会直接修改:

classNotifier:defsend(self,message):print("记录日志")print(f"发送消息:{message}")

问题:

  • 原类被污染
  • 职责变多
  • 违反单一职责原则

或者用继承:

classLogNotifier(Notifier):defsend(self,message):print("记录日志")super().send(message)

如果再加:

  • 短信增强
  • 权限校验
  • 重试机制

继承会越来越复杂。


三、经典装饰器模式结构

装饰器模式包含:

  1. Component(抽象组件)
  2. ConcreteComponent(具体组件)
  3. Decorator(抽象装饰器)
  4. ConcreteDecorator(具体装饰器)

结构核心:

装饰器和被装饰对象实现同一个接口。


四、Python 实现经典装饰器模式

1️⃣ 定义组件接口

fromabcimportABC,abstractmethodclassNotifier(ABC):@abstractmethoddefsend(self,message):pass

2️⃣ 具体组件

classBaseNotifier(Notifier):defsend(self,message):print(f"发送消息:{message}")

3️⃣ 抽象装饰器

classNotifierDecorator(Notifier):def__init__(self,notifier:Notifier):self._notifier=notifierdefsend(self,message):self._notifier.send(message)

4️⃣ 具体装饰器

增加日志功能:

classLogDecorator(NotifierDecorator):defsend(self,message):print("记录日志")super().send(message)

增加权限校验:

classAuthDecorator(NotifierDecorator):defsend(self,message):print("权限校验")super().send(message)

5️⃣ 组合使用

notifier=BaseNotifier()notifier=LogDecorator(notifier)notifier=AuthDecorator(notifier)notifier.send("系统通知")

输出:

权限校验 记录日志 发送消息: 系统通知

注意:

  • 功能可以任意组合
  • 不需要修改原类
  • 不需要继承爆炸

五、装饰器模式的核心价值

装饰器本质是:

用组合替代继承,实现功能叠加。

它非常适合:

  • 功能可叠加
  • 功能可拆分
  • 功能可动态组合

六、Python 语法级装饰器

Python 自带语法糖:

@decoratordeffunc():pass

本质上就是:

func=decorator(func)

这其实是函数级别的装饰器模式。


示例:日志装饰器

deflog_decorator(func):defwrapper(*args,**kwargs):print("记录日志")returnfunc(*args,**kwargs)returnwrapper

使用:

@log_decoratordefsay_hello():print("hello")say_hello()

这就是函数版本的装饰器模式。


七、类装饰器 vs 函数装饰器

类装饰器(结构型模式)

  • 面向对象
  • 组合增强对象行为
  • 更接近 GoF 定义

函数装饰器(Python 特性)

  • 面向函数
  • 语法糖支持
  • 常用于 AOP

二者本质一致:

包一层,增强行为。


八、装饰器 vs 代理模式

很多人会混淆。

区别在于:

对比点装饰器代理
目的增强功能控制访问
是否强调功能叠加
是否可多层叠加通常不是重点

一句话区分:

装饰器关注“增强”,
代理关注“控制”。


九、装饰器模式优缺点

✅ 优点

  • 动态扩展功能
  • 符合开闭原则
  • 避免继承爆炸
  • 高度灵活

❌ 缺点

  • 多层嵌套可能难以调试
  • 对象结构变复杂
  • 不当使用会变成“套娃地狱”

十、真实项目中的应用

几乎无处不在:

  • Django 中的装饰器
  • Flask 路由装饰器
  • 缓存装饰器
  • 重试装饰器
  • 权限装饰器
  • 事务装饰器

你每天都在用它。


十一、一句话总结

装饰器模式的本质是:
在不修改原类的前提下,动态增强对象功能。

在 Python 里:

  • 结构型装饰器解决类增强
  • 语法级装饰器解决函数增强
  • 本质一致:组合 + 包装
http://www.jsqmd.com/news/436803/

相关文章:

  • 基于物联网的智能家居控制系统
  • 2026年3月减速器出厂检测台厂家最新推荐,一站式出厂验收检测平台 - 品牌鉴赏师
  • 企业信息化升级必备:OA系统开启高效办公新篇章!
  • 2026年3月成都爬架厂家推荐榜,彰显国产技术实力 - 品牌鉴赏师
  • 出海实战:海外版上门O2O系统部署指南
  • UE5.7插件:AudioRecorder
  • 手把手教你部署上门O2O海外版:多语言实战
  • 2026年柔性抗金属标签厂家推荐排行榜:RFID/超高频/UHF/可打印/易碎防伪全系列,精选优质品牌助力智能资产管理 - 品牌企业推荐师(官方)
  • 基于单片机的太阳能热水器系统设计(有完整资料)
  • 市场较好的隔油池实力厂家哪家好?2026排行参考,隔油池/混凝土化粪池/玻璃钢化粪池/环保储水罐,隔油池厂商排行榜 - 品牌推荐师
  • 2026年南通AI搜索推广服务商推荐榜:AI搜索优化、AI获客与GEO推广的智能解决方案精选 - 品牌企业推荐师(官方)
  • 深入解析Linux中的rc.local
  • Chromium 144 编译指南 macOS篇:编译优化技巧(六)
  • 2026年 广告标识厂家推荐榜单:宣传栏/发光字/导视系统/楼顶幕墙发光字/广告牌/不锈钢发光字/精神堡垒,匠心工艺与视觉创意解决方案 - 品牌企业推荐师(官方)
  • 基于单片机智能温控水杯系统(有完整资料)
  • 低代码开发,开启企业数字化转型新篇章
  • WordPieceTokenizer
  • 基于AI支持下的自然科学研究全流程实践技术应用
  • 快速排序基础递归版
  • 2026年 南通直播代运营服务商推荐榜单:全案直播策划/主播代播/带货转化,本地企业直播闭环解决方案深度解析 - 品牌企业推荐师(官方)
  • 2026年3月不锈钢桥架厂家推荐榜,彰显国产技术实力 - 品牌鉴赏师
  • Qt QEventLoop类,10分钟讲清楚
  • 2026年3月全钢附着式升降脚手架厂家推荐,行业测评与选择指南 - 品牌鉴赏师
  • Qt QQuickView,10分钟讲清楚
  • 科晶生物实战:基于AI算法进行蛋白质改造的模型管线
  • 写好Prompt的最佳实践:7个具体步骤
  • 碳中和承诺示范单位认定标准与价值解读
  • AI绘图神器来袭,这下网络拓扑再也不用愁
  • 中美储能系统热失控管理之气体探测安全防护策略对比
  • 低代码平台横评:8大主流厂商的权限模型、审计留痕与密钥治理