【Python设计模式05】装饰模式
装饰模式(Decorator Pattern)是一种结构型设计模式,它允许向一个现有对象添加新的功能,同时又不改变其结构。装饰模式通过创建一个装饰类来包裹原始类,从而在不修改原始类代码的情况下扩展对象的功能。
装饰模式的结构
装饰模式包含以下几个角色:
- 组件接口(Component):定义对象的接口,可以动态地给对象添加职责。
- 具体组件(ConcreteComponent):实现组件接口的类,代表要被装饰的对象。
- 装饰器(Decorator):实现组件接口,并持有一个组件对象(通常是通过组合的方式)。
- 具体装饰器(ConcreteDecorator):扩展装饰器类,添加新的职责。
示例
假设我们有一个基本的文本消息类,我们希望能够动态地添加一些装饰功能,比如加密消息或将消息转换为大写。
定义组件接口和具体组件
from abc import ABC, abstractmethodclass Message(ABC):@abstractmethoddef get_content(self) -> str:passclass TextMessage(Message):def __init__(self, content: str):self.content = contentdef get_content(self) -> str:return self.content
定义装饰器和具体装饰器
class MessageDecorator(Message):def __init__(self, message: Message):self._message = messagedef get_content(self) -> str:return self._message.get_content()class EncryptedMessage(MessageDecorator):def get_content(self) -> str:original_content = super().get_content()return self._encrypt(original_content)def _encrypt(self, content: str) -> str:return f"Encrypted({content})"class UppercaseMessage(MessageDecorator):def get_content(self) -> str:original_content = super().get_content()return original_content.upper()
使用装饰器
def main():message = TextMessage("Hello, World!")encrypted_message = EncryptedMessage(message)print(encrypted_message.get_content()) # 输出:Encrypted(Hello, World!)uppercase_message = UppercaseMessage(message)print(uppercase_message.get_content()) # 输出:HELLO, WORLD!# 组合装饰器encrypted_uppercase_message = EncryptedMessage(UppercaseMessage(message))print(encrypted_uppercase_message.get_content()) # 输出:Encrypted(HELLO, WORLD!)if __name__ == "__main__":main()
在这个示例中,Message是组件接口,TextMessage是具体组件,MessageDecorator是装饰器,EncryptedMessage和UppercaseMessage是具体装饰器。装饰器可以在不修改TextMessage类的情况下,动态地给对象添加新的功能。
装饰模式的优缺点
优点
- 遵循开闭原则:可以在不修改现有代码的情况下扩展对象的功能。
- 组合功能:可以通过多个装饰器组合来实现复杂的功能。
- 灵活性:可以动态地添加或移除对象的功能。
缺点
- 增加复杂性:每个装饰器都需要创建一个新类,可能会导致类的数量增加,增加系统的复杂性。
- 调试困难:由于装饰器的层次结构,调试可能会变得更加复杂。
装饰模式的适用场景
- 需要动态地添加功能:当需要动态地给对象添加功能,并且可以在运行时选择不同的装饰器时,适合使用装饰模式。
- 替代子类继承:当通过子类继承来扩展功能导致类爆炸时,可以考虑使用装饰模式。
总结
装饰模式是一种结构型设计模式,通过创建装饰类来包裹原始类,实现动态地给对象添加新功能。装饰模式遵循开闭原则,使得系统更具灵活性和可扩展性。尽管装饰模式会增加系统的复杂性,但在需要动态扩展对象功能的场景中,装饰模式是一种非常有用的设计模式。合理应用装饰模式,可以显著提高代码的可维护性和可复用性。
相关文章:
【Python设计模式05】装饰模式
装饰模式(Decorator Pattern)是一种结构型设计模式,它允许向一个现有对象添加新的功能,同时又不改变其结构。装饰模式通过创建一个装饰类来包裹原始类,从而在不修改原始类代码的情况下扩展对象的功能。 装饰模式的结构…...
kafka 消费模式基础架构
kafka 消费模式 &基础架构 目录概述需求: 设计思路实现思路分析1.kafka 消费模式基础架构基础架构2: 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy,skip hardness,…...
nginx安装部署问题
记一次nginx启动报错问题处理 问题1 内网部署nginx,开始执行make,执行不了,后面装了依赖的环境 yum install gcc-c 和 yum install -y pcre pcre-devel 问题2,启动nginx报错 解决nginx: [emerg] unknown directive “stream“ in…...
揭开Java序列化的神秘面纱(上)Serializable使用详解
Java序列化(Serialization)作为一项核心技术,在Java应用程序的多个领域都有着广泛的应用。无论是通过网络进行对象传输,还是实现对象的持久化存储,序列化都扮演着关键的角色。然而,这个看似简单的概念蕴含着丰富的原理和用法细节&…...
深度学习——自己的训练集——图像分类(CNN)
图像分类 1.导入必要的库2.指定图像和标签文件夹路径3.获取文件夹内的所有图像文件名4.获取classes.txt文件中的所有标签5.初始化一个字典来存储图片名和对应的标签6.遍历每个图片名的.txt文件7.随机选择一张图片进行展示8.构建图像的完整路径9.加载图像10.检查图像是否为空 随…...
goimghdr,一个有趣的 Python 库!
更多Python学习内容:ipengtao.com 大家好,今天为大家分享一个有趣的 Python 库 - goimghdr。 Github地址:https://github.com/corona10/goimghdr 在图像处理和分析过程中,识别图像文件的类型是一个常见的需求。Python自带的imghdr…...
每小时电量的计算sql
计算思路,把每小时的电表最大记录取出来,然后用当前小时的最大值减去上个小时的最大值即可。 使用了MYSQL8窗口函数进行计算。 SELECT b.*,b.epimp - b.lastEmimp ecValue FROM ( SELECT a.deviceId,a.ctime,a.epimp, lag(epimp) over (ORDER BY a.dev…...
自动化您的任务——crewAI 初学者教程
今天,我写这篇文章是为了分享您开始使用一个非常流行的多智能体框架所需了解的所有信息:crewAI。 我将在这里或那里跳过一些内容,使本教程成为一个精炼的教程,概述帮助您入门的关键概念和要点 今天,我写这篇文章是为了…...
K8s集群中的Pod调度约束亲和性与反亲和性
前言 在 K8s 集群管理中,Pod 的调度约束——亲和性(Affinity)与反亲和性(Anti-Affinity)这两种机制允许管理员精细控制 Pod 在集群内的分布方式,以适应多样化的业务需求和运维策略。本篇将介绍 K8s 集群中…...
kafka之consumer参数auto.offset.reset
Kafka的auto.offset.reset 参数是用于指定消费者在启动时如何处理偏移量(offset)的。这个参数有三个主要的取值:earliest、latest和none。 earliest: 当各分区下有已提交的offset时,从提交的offset开始消费;…...
回答篇二:测试开发高频面试题目
引用之前文章:测试开发高频面试题目 本篇文章是回答篇(持续更新中) 1. 在测试开发中使用哪些自动化测试工具和框架?介绍一下你对其中一个工具或框架的经验。 a. 测试中经常是用的自动化测试工具和框架有Selenium、Pytest、Postman…...
React18 apexcharts数据可视化之甜甜圈图
03 甜甜圈图 apexcharts数据可视化之甜甜圈图。 有完整配套的Python后端代码。 本教程主要会介绍如下图形绘制方式: 基本甜甜圈图个性图案的甜甜圈图渐变色的甜甜圈图 面包圈 import ApexChart from react-apexcharts;export function DonutUpdate() {// 数据…...
如何通过OpenHarmony的音频模块实现录音变速功能?
简介 OpenAtom OpenHarmony(以下简称“OpenHarmony”)是由开放原子开源基金会孵化及运营的开源项目,是面向全场景、全连接、全智能时代的智能物联网操作系统。 多媒体子系统是OpenHarmony系统中的核心子系统,为系统提供了相机、…...
探索 Rust 语言的精髓:深入 Rust 标准库
探索 Rust 语言的精髓:深入 Rust 标准库 Rust,这门现代编程语言以其内存安全、并发性和性能优势而闻名。它不仅在系统编程领域展现出强大的能力,也越来越多地被应用于WebAssembly、嵌入式系统、分布式服务等众多领域。Rust 的成功࿰…...
Log360:护航安全,远离暗网风险
暗网有时候就像是一个神秘的地下世界,是互联网的隐蔽角落,没有任何规则。这是一个被盗数据交易、网络犯罪分子策划下一步攻击的地方。但仅仅因为它黑暗,不意味着你要对潜在的威胁视而不见。 暗网 这就是ManageEngine Log360的用武之地&…...
react使用antd警告:Warning: findDOMNode is deprecated in StrictMode.
警告信息: Warning: findDOMNode is deprecated in StrictMode. findDOMNode was passed an instance of DOMWrap which is inside StrictMode. Instead, add a ref directly to the element you want to reference. Learn more about using refs safely here: htt…...
Docker Swarm - 删除 worker 节点
1、前提:集群环境已经运行 在manager节点上执行: # 查看节点信息 >>> docker node lsID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION jr06s8pbrclkrxt7jpy7wae8t * iZ2ze78653g2…...
AI视频智能分析技术赋能营业厅:智慧化管理与效率新突破
一、方案背景 随着信息技术的快速发展,图像和视频分析技术已广泛应用于各行各业,特别是在营业厅场景中,该技术能够有效提升服务质量、优化客户体验,并提高安全保障水平。TSINGSEE青犀智慧营业厅视频管理方案旨在探讨视频监控和视…...
骨折分类数据集1129张10类别
数据集类型:图像分类用,不可用于目标检测无标注文件 数据集格式:仅仅包含jpg图片,每个类别文件夹下面存放着对应图片 图片数量(jpg文件个数):1129 分类类别数:10 类别名称:["avulsion_fracture",…...
Follow Your Pose: Pose-Guided Text-to-Video Generation using Pose-Free Videos
清华深&港科&深先进&Tencent AAAI24https://github.com/mayuelala/FollowYourPose 问题引入 本文的任务是根据文本来生成高质量的角色视频,并且可以通过pose来控制任务的姿势;当前缺少video-pose caption数据集,所以提出一个两…...
YOLOv8无人机红外识别检测系统(项目源码+YOLO数据集+模型权重+UI界面+python+深度学习+环境配置)
摘要 面向无人机平台的红外目标检测在夜间及低能见度环境下具有重要应用价值。本文基于YOLOv8构建了一套针对车辆与行人的红外检测系统,数据集包含4类目标(Car、DontCare、OtherVehicle、Person),共计10128张训练图像、715张验证…...
chatgpt-mirai-qq-bot内存持久化:文件和Redis存储方案对比
chatgpt-mirai-qq-bot内存持久化:文件和Redis存储方案对比 你是否在为聊天机器人的记忆管理而烦恼?在多轮对话中,如何确保机器人能够记住上下文,同时保证数据的安全性和性能?chatgpt-mirai-qq-bot提供了两种内存持久化…...
为什么angular-dragdrop是AngularJS开发者的必备工具?
为什么angular-dragdrop是AngularJS开发者的必备工具? 【免费下载链接】angular-dragdrop Implementing jQueryUI Drag and Drop functionality in AngularJS (with Animation) is easier than ever 项目地址: https://gitcode.com/gh_mirrors/an/angular-dragdro…...
Windows 11 Fixer终极指南:一键优化你的Windows 11系统体验
Windows 11 Fixer终极指南:一键优化你的Windows 11系统体验 【免费下载链接】Windows-11-Fixer A tool to "Fix" Windows 11 项目地址: https://gitcode.com/gh_mirrors/wi/Windows-11-Fixer Windows 11 Fixer是一款专为Windows 11用户设计的系统优…...
【Linux内核模块】模块的编译:从代码到可加载模块的 “变身术“
一、内核模块编译的特殊性:为什么不能直接用 gcc?普通 C 程序编译很简单,gcc hello.c -o hello就行,但内核模块可不行。这就像做面包和做蛋糕的区别 —— 虽然都是面粉做的,但烤箱温度、配料比例完全不同。1.1 内核模块…...
G-Helper完整指南:如何用10MB替代华硕Armoury Crate实现笔记本极致优化
G-Helper完整指南:如何用10MB替代华硕Armoury Crate实现笔记本极致优化 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, Vivob…...
强烈推荐!这款顶伯 工具拯救了我的日更视频账号
强烈推荐!这款顶伯 TTS 工具拯救了我的日更视频账号做日更视频账号最痛苦的是什么?是配音。 以前我每天花两小时录音、降噪、剪辑,嗓子还经常哑。直到用了顶伯文字转语音工具,一切都变了。它基于微软 TTS 技术,音质自然…...
Midjourney构图进阶实战指南(98%用户从未调过的--sref与--style参数协同逻辑大揭秘)
更多请点击: https://intelliparadigm.com 第一章:Midjourney构图进阶实战指南(98%用户从未调过的--sref与--style参数协同逻辑大揭秘) 在Midjourney V6中, --sref(Style Reference)与 --style…...
从图灵完备到意图完备:人工智能的本体论跃迁
什么是真正的智能?是能够执行任意计算任务,还是能够在世界中“存在”,感知、欲望、思考和行动?是能够给出所有正确答案,还是能够提出一个有意义的问题?是能够优化任何给定的目标,还是能够为自己…...
如何用AntiMicroX解决PC游戏手柄兼容问题:5分钟快速上手终极手柄映射工具
如何用AntiMicroX解决PC游戏手柄兼容问题:5分钟快速上手终极手柄映射工具 【免费下载链接】antimicrox Graphical program used to map keyboard buttons and mouse controls to a gamepad. Useful for playing games with no gamepad support. 项目地址: https:/…...
