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

Python设计模式 - 装饰模式

定义

装饰模式(Decorator Pattern)是一种结构型设计模式,用于在不修改原有类的情况下动态地扩展对象的功能。

结构

在这里插入图片描述

  • 抽象组件(Component):定义对象的公共接口,使得客户端能以一致的方式处理未被装饰的对象和装饰之后的对象。
  • 具体组件(Concrete Component):实现抽象组件接口,是被装饰的对象。
  • 装饰器(Decorator):实现抽象组件接口,并持有一个抽象组件的引用(即被装饰的对象)。
  • 具体装饰器(Concrete Decorator):扩展组件对象的行为。

应用场景

  1. 不修改原有类代码的情况下扩展其功能:当原有类已经投入使用,或者由于某些原因(如第三方库)无法直接修改时,可以使用装饰模式来扩展功能,而不影响原有类的结构。例如,日志系统中对原始日志进行加密、压缩、写入多个目标(如控制台、文件、远程服务器)等。
  2. 替代复杂的继承结构:当功能组合的可能性较多,使用继承会导致子类爆炸时,装饰模式是一种更好的解决方案。相比于继承,它提供了更高的灵活性,可以在运行时自由组合功能,而不是提前在类层次结构中定义。例如,图形渲染系统中对图形添加不同的修饰(阴影、边框、透明度调整)等。

优缺点

优点

  1. 比继承更灵活,避免类爆炸:继承方式扩展功能时,每个新的功能组合都可能导致大量的子类。而装饰模式可以通过对象组合动态扩展,不需要为每种组合定义一个新的子类。
  2. 提高代码的可复用性:每个装饰器都是独立的,可以在不同的对象上复用,避免了在每个类中实现类似功能的重复工作。
  3. 装饰器可以叠加,提供更强的扩展能力:由于装饰器遵循相同的接口,可以通过嵌套多个装饰器来灵活组合功能,从而轻松实现复杂的功能增强。

缺点

  1. 增加了系统的复杂性:装饰模式通过组合多个小的装饰器来扩展功能,可能导致系统中产生大量的装饰器对象,特别是在功能组合较多时,增加了理解和维护的难度。
  2. 可能影响性能:每次方法调用都需要经过多个装饰器的转发和处理,尤其是装饰器链较长时,这可能导致性能下降,尤其在高频调用的场景下更加明显。
  3. 可能导致调试困难:装饰器层层嵌套,每个装饰器都可能改变对象的行为,这使得追踪和调试变得更加复杂。

代码示例

from abc import ABC, abstractmethod# 抽象组件类(Component)
class Text(ABC):@abstractmethoddef render(self):pass# 具体组件类(Concrete Component)
class PlainText(Text):def __init__(self, content):self.content = contentdef render(self):return self.content# 装饰器基类(Decorator)
class TextDecorator(Text):def __init__(self, wrapped_text):self._wrapped_text = wrapped_textdef render(self):return self._wrapped_text.render()# 具体装饰器类(Concrete Decorator)- 加粗
class BoldText(TextDecorator):def render(self):return f"<b>{super().render()}</b>"# 具体装饰器类(Concrete Decorator)- 斜体
class ItalicText(TextDecorator):def render(self):return f"<i>{super().render()}</i>"# 具体装饰器类(Concrete Decorator)- 下划线
class UnderlineText(TextDecorator):def render(self):return f"<u>{super().render()}</u>"# 使用装饰模式
if __name__ == "__main__":# 创建原始文本对象text = PlainText("Hello, World!")print(text.render())  # 输出:Hello, World!# 加粗文本bold_text = BoldText(text)print(bold_text.render())  # 输出:<b>Hello, World!</b># 斜体加粗文本italic_bold_text = ItalicText(bold_text)print(italic_bold_text.render())  # 输出:<i><b>Hello, World!</b></i># 斜体加粗下划线文本styled_text = UnderlineText(italic_bold_text)print(styled_text.render())  # 输出:<u><i><b>Hello, World!</b></i></u>

参考

《设计模式的艺术》

http://www.dtcms.com/a/324326.html

相关文章:

  • 新手向:Python实现文件加密解密工具
  • 旅行者1号无线电工作频段
  • 18.3 全量微调:数据预处理之清洗与准备
  • 机器学习——DBSCAN 聚类算法 + 标准化
  • 实现两个开发板的串口通讯(基于STC8实现)
  • 复刻苏宁易购(移动端)
  • 【GPT入门】第44课 检查 LlamaFactory微调Llama3的效果
  • cursor, vscode黄色波浪线警告问题
  • React:useEffect 与副作用
  • 小巧实用的工具——ZoomIt
  • 【C++对象诞生全解析】构造函数:从内存布局到高效初始化的终极指南
  • 152-基于CWT-CNN-BiGRU-Attention-SABO-LSSVM对滚动轴承的故障诊断
  • spring-boot-starter-data-redis 与 org.redisson 区别 联系
  • 【递归、搜索与回溯算法】深度优先搜索
  • Text2SQL 自助式数据报表开发(Chat BI)
  • 《解锁 C++ 起源与核心:命名空间用法 + 版本演进全知道》
  • Spring Boot 注解详解:@RequestMapping 的多种用法
  • Docker 跨主机容器之间的通信macvlan
  • 攻击实验(ARP欺骗、MAC洪范、TCP SYN Flood攻击、DHCP欺骗、DHCP饿死)
  • Spring Boot与WebSocket构建物联网实时通信系统
  • LeetCode 子集
  • Java基础-Map接口
  • 香橙派 RK3588 部署 DeepSeek
  • SQL约束:数据完整性的守护者
  • Linux中rsync数据镜像工具的解析与应用实战
  • 如何在 Ubuntu 24.04 LTS Linux 上安装 MySQL 服务器
  • JavaScript防抖与节流:拯救你的网页卡顿危机!
  • GitHub 趋势日报 (2025年08月09日)
  • 通过Certbot自动申请更新HTTPS网站的SSL证书
  • vue中使用h5plus