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.pswp.cn/news/918300.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/918300.shtml
英文地址,請注明出處:http://en.pswp.cn/news/918300.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MySQL(188)如何使用MySQL的慢查詢工具?

使用MySQL的慢查詢工具可以幫助開發者識別和優化性能不佳的SQL查詢。以下是詳細深入的步驟和代碼示例&#xff0c;幫助你使用MySQL的慢查詢工具來進行查詢分析和優化。 一、啟用慢查詢日志 首先&#xff0c;你需要確保MySQL的慢查詢日志功能是啟用的。慢查詢日志記錄了所有執行…

如何培養自己工程化的能力(python項目)

培養 Python 項目的工程化能力需要系統性訓練&#xff0c;以下從基礎到高階的實踐路徑&#xff0c;結合具體案例和工具鏈&#xff0c;幫助你逐步進階&#xff1a;一、夯實工程化基礎能力?1. 規范代碼與項目結構??項目模板化?使用 cookiecutter生成標準項目結構&#xff0c;…

AI編程插件對比分析:CodeRider、GitHub Copilot及其他

AI編程插件對比分析:CodeRider、GitHub Copilot及其他 隨著人工智能技術的快速發展,AI編程插件已成為提升開發者生產力的重要工具。CodeRider和GitHub Copilot作為市場上的領先者,分別以其獨特的特性和生態系統吸引了大量開發者。本文將從功能特性、性能表現、集成性、用戶…

uniapp/uniappx實現圖片或視頻文件選擇時同步告知權限申請目的解決華為等應用市場上架審核問題

在UNIAPP支持vue和nvue,在UNIAPPX支持uvue&#xff0c;安卓支持在選擇圖片或視頻文件權限申請的時候自動同步告知權限申請目的。輕松解決在華為應用市場審核&#xff0c;要求告知權限申請目的或說明的問題。 UNIAPP相冊圖片視頻選擇器(安卓可以自定義界面樣式)功能介紹&#x…

jupyter notebook如何打開其他盤目錄

問題描述Jupyter Notebook 相信是我們學習 Python 避不開的一個工具。當我們使用 pip install notebook 安裝 Notebook 之后&#xff0c;使用命令 jupyter notebook 啟動服務&#xff0c;啟動之后默認會在瀏覽器打開界面。我們會發現&#xff0c;這個界面默認在 C 盤下&#xf…

C語言深度剖析

一、關鍵字 1.1 最快的關鍵字-register register 這個關鍵字請求編譯器盡可能將變量存在CPU內部寄存器中,而不是通過內存尋址以提高效率。 注意是:盡可能、而不是絕對 1.1.1 皇帝身邊的小太監-寄存器 不知道什么是寄存器,那見過太監沒有其實寄存器就是相當于。一個cpu的…

電腦使用“碎片整理”程序的作用

1.解決文件碎片化問題碎片整理的作用&#xff1a;將這些分散的文件片段重新整理、拼接&#xff0c;使其連續存儲在硬盤的某個區域&#xff0c;減少文件的 “碎片化” 程度。2. 提升硬盤讀寫速度機械硬盤的特殊性&#xff1a;機械硬盤依賴磁頭的物理移動來讀取數據&#xff0c;若…

AI 軟件工程開發 AI 算法 架構與業務

AI 軟件工程開發 & AI 算法 & 架構與業務前言1.AI 軟件工程開發1.1. AI Developer Studio &#xff08;playground級&#xff09;1.2. Agent & RAG1.3. LangChain & LangGraph1.4. MCP, Model Context Protocol1.5. Ollama1.6. Coze & Dify2.AI 算法2.1. G…

uniapp實現的圓形滾盤組件模板

采用 uniapp 實現的一款圓形滾盤示例組件模板, 支持 vue2、vue3&#xff0c;適配H5、微信小程序&#xff08;其他小程序未試過&#xff0c;可自行嘗試&#xff09; 代碼實現簡約易懂&#xff0c;用戶可根據自身需求下載模板&#xff0c;并進行擴展開發可到插件市場下載嘗試&…

無須炮解,打開即是Pro版

聊一聊 文檔或文件轉圖片&#xff0c;這個我有段時間沒有推薦了。 今天發現了一款非常好用的圖像格式轉換編輯軟件。 有需要的小伙伴請及時收藏&#xff0c;防止下次找不到。 軟件介紹 全能圖像格式轉換工具 這是一款全能的圖像轉換軟件&#xff0c;支持幾乎所有的圖像格式…

企業高性能web服務器——Nginx

Nginx介紹 Nginx是一個高性能的HTTP和反向代理服務器&#xff0c;也是一個郵件代理服務器。由俄羅斯的程序設計師Igor Sysoev所開發&#xff0c;官方測試nginx能夠支撐5萬并發鏈接&#xff0c;并且cpu、內存等資源消耗卻非常低&#xff0c;運行非常穩定。所以其特點是占有內存…

MCU控制ADAU1701,用System Workbench for STM32導入工程

作者的話 MCU控制ADAU1701&#xff0c;我有寫一個文檔詳細講步驟&#xff0c;里頭用到了System Workbench for STM32這個軟件&#xff0c;他是基于eclips內核的開發軟件&#xff0c;一般來講&#xff0c;設置好workspce工程就會出來&#xff0c;但是架不住就有設置好工程不出來…

SQL176 每個題目和每份試卷被作答的人數和次數

描述現有試卷作答記錄表exam_record&#xff08;uid用戶ID, exam_id試卷ID, start_time開始作答時間, submit_time交卷時間, score得分&#xff09;&#xff1a;iduidexam_idstart_timesubmit_timescore1100190012021-09-01 09:01:012021-09-01 09:41:01812100290022021-09-01 …

構建第三方軟件倉庫

1 下載第三方軟件到指定目錄[rootServer_b ~]# mkdir software [rootServer_b software]# wget https://dldir1v6.qq.com/qqfile/qq/QQNT/Linux/QQ_3.2.18_250724_x86_64_01.rpm2 安裝軟件信息采集工具[rootServer_b software]# yum install createrepo -y [rootServer_b softw…

Linux 管道命令及相關命令練習與 Shell 編程、Tomcat 安裝

2.實驗目的掌握 Linux 管道命令及相關命令&#xff08;cut、sort、wc、uniq、tee、tr、split&#xff09;的使用方法。學會使用 Shell 編程實現基本的計算器功能。掌握在 CentOS 7 系統中安裝 Tomcat 的方法。實驗內容1. Linux 管道命令及相關命令練習1.1 管道命令定義&#xf…

藍牙基礎:FIFO(First-In-First-Out)緩存區

在藍牙通信中&#xff0c;FIFO&#xff08;First-In-First-Out&#xff0c;先進先出&#xff09;緩存區是解決數據傳輸中“速度不匹配”和“時序異步”問題的核心機制&#xff0c;廣泛應用于藍牙芯片內部、協議棧各層級及主從設備交互中。其核心作用是臨時存儲數據&#xff0c;…

國內外主流源代碼平臺與高效開發指南

摘要 本文旨在為您提供一份實用的源代碼獲取與開發指南。我們將首先梳理國內外最主流的源代碼托管平臺&#xff0c;并重點介紹如何利用這些平臺上的開源項目。接著&#xff0c;本文將為您規劃一條針對初學者的“最快最性價比”的開發路徑&#xff0c;從環境配置、項目管理到實…

任務進度狀態同步 萬能版 參考 工廠+策略+觀察者設計模式 +鎖設計 springboot+redission

文章目錄概要效果解釋狀態流轉說明設計AI任務實體類AI任務狀態枚舉AI模型枚舉基礎實體類簡單字典接口工廠策略模式 接口設計AiJobProcessorAiJobProcessorFactory觀察者模式AI任務相關的EventMyEventListenerMyEventPubLisherRedissonConfig定時任務實現ReplicateJobProcessorR…

printf函數格式化輸出攻略

目錄 一、基本用法 二、占位符 基本用法 常用占位符 字符串占位符示例 多占位符示例 注意事項 三、占位符列表 基本數據類型占位符 浮點數占位符 特殊類型占位符 長度修飾符 使用示例 注意事項 四、輸出格式 1、限定寬度 基本用法 左對齊輸出 浮點數寬度限制…

AI小智單片機esps32-s3燒錄教程

1. 下載代碼到本地 代碼地址&#xff1a;https://github.com/78/xiaozhi-esp32 2. vscode安裝環境 安裝一下這個插件 3. esp32-s3通過數據線連接電腦 【圖片】 4. vscode選擇對應配置 如果是用自己的服務還得改下地址 5. 點擊構建 6. 點擊燒錄