23種設計模式——裝飾器模式(Decorator Pattern)詳解

?作者簡介:大家好,我是 Meteors., 向往著更加簡潔高效的代碼寫法與編程方式,持續分享Java技術內容。
🍎個人主頁:Meteors.的博客
💞當前專欄:設計模式
?特色專欄:知識分享
🥭本文內容:23種設計模式——裝飾器模式(Decorator Pattern)
📚 ** ps **? :閱讀文章如果有問題或者疑惑,歡迎在評論區提問或指出。


目錄

一. 背景

二. 簡介

三. 特點

四. 適用場景

五. 代碼示例

六.?總結


一. 背景

剛學習這個設計模式感覺它和工廠模式長的很像(都有一個抽象類)。但具體觀察,發現它最大的不同——套娃(一個抽象裝飾器類,里面有基類變量和參數為基類變量的構造方法,之后每次繼承裝飾器,并傳入這個變量,就能得到一個新的裝飾器.......你可能會問這樣“套娃”的新類有什么不同?其實每次繼承的時候,它還會重寫其它方法,對方法進行設定)


二. 簡介

裝飾器模式是一種結構型設計模式,它允許向一個現有的對象添加新的功能,同時又不改變其結構。這種模式創建了一個裝飾類,用來包裝原有的類,并在保持類方法簽名完整性的前提下,提供了額外的功能。


三. 特點

  • 動態地為對象添加功能
  • 比繼承更靈活(避免繼承導致的子類膨脹問題)
  • 裝飾類和被裝飾類可以獨立發展,不會相互耦合
  • 符合"開閉原則"(對擴展開放,對修改關閉)

四. 適用場景

  • 需要在不影響其他對象的情況下,以動態、透明的方式給單個對象添加職責
  • 需要動態添加功能,也能動態撤銷功能
  • 當不能采用繼承的方式對系統進行擴充時

五. 代碼示例

// 抽象組件
interface Coffee {double getCost();String getDescription();
}// 具體組件
class SimpleCoffee implements Coffee {@Overridepublic double getCost() {return 1.0;}@Overridepublic String getDescription() {return "Simple coffee";}
}// 抽象裝飾器
abstract class CoffeeDecorator implements Coffee {protected final Coffee decoratedCoffee;public CoffeeDecorator(Coffee coffee) {this.decoratedCoffee = coffee;}@Overridepublic double getCost() {return decoratedCoffee.getCost();}@Overridepublic String getDescription() {return decoratedCoffee.getDescription();}
}// 具體裝飾器 - 加牛奶
class MilkDecorator extends CoffeeDecorator {public MilkDecorator(Coffee coffee) {super(coffee);}@Overridepublic double getCost() {return super.getCost() + 0.5;}@Overridepublic String getDescription() {return super.getDescription() + ", with milk";}
}// 具體裝飾器 - 加糖
class SugarDecorator extends CoffeeDecorator {public SugarDecorator(Coffee coffee) {super(coffee);}@Overridepublic double getCost() {return super.getCost() + 0.2;}@Overridepublic String getDescription() {return super.getDescription() + ", with sugar";}
}// 使用示例
public class DecoratorPatternDemo {public static void main(String[] args) {Coffee simpleCoffee = new SimpleCoffee();System.out.println("Cost: " + simpleCoffee.getCost() + "; Description: " + simpleCoffee.getDescription());Coffee milkCoffee = new MilkDecorator(simpleCoffee);System.out.println("Cost: " + milkCoffee.getCost() + "; Description: " + milkCoffee.getDescription());Coffee sugarMilkCoffee = new SugarDecorator(milkCoffee);System.out.println("Cost: " + sugarMilkCoffee.getCost() + "; Description: " + sugarMilkCoffee.getDescription());}
}

六.?總結

裝飾器模式通過組合而非繼承的方式擴展對象的功能,提供了比繼承更有彈性的替代方案。在Java中,IO流的設計就是裝飾器模式的經典應用(如BufferedReader裝飾FileReader)。當需要為對象動態添加功能時,裝飾器模式是一個很好的選擇。


最后,

? ? ? ? 其它設計模式會陸續更新,希望文章對你有所幫助!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/96042.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/96042.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/96042.shtml

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

相關文章

《sklearn機器學習——聚類性能指標》Davies-Bouldin Index (戴維斯-博爾丁指數)

Davies-Bouldin Index (戴維斯-博爾丁指數)簡介 概念與定義 Davies-Bouldin Index是由David L. Davies和Donald W. Bouldin于1979年提出的一種用于評估聚類算法效果的內部指標。它通過計算每個簇內數據點之間的相似性和不同簇中心點的距離來衡量聚類結果的質量。DBI的值越低&am…

QT的學習(一)

前言:距離上一次摸QT已經快10年了,時光匆匆,現在已經到6.9版本了 一、安裝QT 1.1、下載鏈接 https://mirrors.tuna.tsinghua.edu.cn/qt/official_releases/online_installers/ 這是國內鏡像,比官網快很多了,官網那個…

亞洲數字能源獨角獸的 “安全密碼”:Parasoft為星星充電筑牢軟件防線

當你在充電樁前等待愛車滿電時,是否想過:這看似簡單的充電過程,背后藏著多少軟件代碼的精密協作?作為亞洲數字能源領域的頭部企業,星星充電用 “移動能源網” 連接著千萬用戶與新能源世界,而支撐這一切的&a…

安裝Codex(需要用npm)

查看已經安裝的包 npm list -g --depth0 npm uninstall -g anthropic-ai/claude-code 如果要卸載什么東西 安裝Codex :npm i -g openai/codex https://openai.com/zh-Hant/codex/ 之后登錄gpt賬號,完成后就是下面的樣子

HarmonyOS 開發學習分享:從入門到認證的完整路徑

HarmonyOS 開發學習分享:從入門到認證的完整路徑 大家好!我是趙老師,一個深耕鴻蒙生態的開發者。最近剛通過鴻蒙生態賦能資源豐富度建設活動的講師認證,想和大家分享一下 HarmonyOS 開發的學習心得和認證經驗。 我的鴻蒙開發經歷作…

使用Spring Boot DevTools快速重啟功能

背景 在Spring Boot項目中,修改一些簡單的代碼后,每次手動終止并啟動整個項目比較繁瑣且消耗時間。Spring Boot DevTools 提供了開發時的熱重啟功能,使得在開發過程中修改代碼后可以快速生效,而無需手動重啟整個應用,可…

7.4Element Plus 分頁與表格組件

el-pagination el-table 這兩個組件是后臺管理系統中最常用的數據展示與交互組合&#xff0c;通常配合使用實現 分頁加載、排序、篩選、操作 等功能。一、分頁組件 el-pagination用于控制大量數據的分頁展示。? 基本結構<el-paginationv-model:current-page"currentPa…

搭建機器學習模型的數據管道架構方案

本篇文章Designing Data Pipeline Architectures for Machine Learning Models適合對數據管道架構感興趣的讀者&#xff0c;亮點在于詳細解析了傳統數據倉庫、云原生數據湖和現代湖倉這三種架構&#xff0c;幫助理解如何將原始數據轉化為可操作的預測。文中還強調了不同架構的優…

GitHub 熱榜項目 - 日榜(2025-09-06)

GitHub 熱榜項目 - 日榜(2025-09-06) 生成于&#xff1a;2025-09-06 統計摘要 共發現熱門項目&#xff1a;15 個 榜單類型&#xff1a;日榜 本期熱點趨勢總結 本期GitHub熱榜顯示AI自動化與安全運維為核心趨勢。Bytebot、EvolutionAPI等AI代理項目凸顯自然語言交互和容器化…

Homebrew執行brew install出現錯誤(homebrew-bottles)

問題描述 在使用homebrew安裝軟件時&#xff0c;出現如下報錯&#xff1a; Downloading https://mirrors.aliyun.com/homebrew/homebrew-bottles/bottles-portable-ruby/portable ruby-3.4.5.arm64_big_sur.bottle.tar.gz curl: (22) The requested URL returned error: 404 …

23種設計模式——工廠方法模式(Factory Method Pattern)詳解

?作者簡介&#xff1a;大家好&#xff0c;我是 Meteors., 向往著更加簡潔高效的代碼寫法與編程方式&#xff0c;持續分享Java技術內容。 &#x1f34e;個人主頁&#xff1a;Meteors.的博客 &#x1f49e;當前專欄&#xff1a;設計模式 ?特色專欄&#xff1a;知識分享 &#x…

NPU邊緣推理識物系統

目錄 NPU邊緣推理識物系統 一、項目簡介 二、硬件介紹 三、軟件設計 1、底層NPU推理代碼 2、應用層QT顯示代碼 四、項目成果展示 NPU邊緣推理識物系統 一、項目簡介 物品分類是計算機視覺的重要技術&#xff0c;本項目的核心是&#xff1a;使用NPU&#xff08;神經網絡…

C# WinForm分頁控件實現與使用詳解

C# WinForm分頁控件實現與使用詳解概述在WinForms應用程序開發中&#xff0c;數據分頁是常見的需求。本文將介紹如何實現一個功能完整的分頁控件&#xff0c;并在窗體中如何使用該控件進行數據分頁展示。分頁控件實現核心屬性與字段public partial class PageControl : UserCon…

高級 ACL 有多強?一個規則搞定 “IP + 端口 + 協議” 三重過濾

一、實驗拓撲及描述 二、實驗需求 1、完成拓撲中各設備的基礎配置&#xff0c;使得全網互通&#xff1b; 2、在上一個需求的基礎上&#xff0c;在路由器上部署高級ACL&#xff0c;使得Client1無法訪問Server的HTTP服務&#xff0c;但是PC1依然能夠訪問服務器及其他節點&#xf…

支持多材質密度設置的金屬重量計算使用指南

傳統手工計算各種型材&#xff08;如鋼管、角鋼、鋼板等&#xff09;的重量繁瑣且容易出錯。 它的體積小巧&#xff0c;不足100KB&#xff0c;運行不占內存&#xff0c;綠色免安裝&#xff0c;雙擊即開&#xff0c;使用便捷。 可計算鋼管、鋼板、型鋼、角鋼等常見型材的重量&a…

在Spring Boot中使用H2數據庫

好處 程序啟動時自動創建數據庫數據表。 使用步驟 引入依賴&#xff1a; <dependency><groupId>com.h2database</groupId><artifactId>h2</artifactId><scope>runtime</scope></dependency><dependency><groupId&…

Day21_【機器學習—決策樹(2)—ID3樹 、C4.5樹、CART樹】

一、ID3 決策樹1. 核心思想使用信息增益&#xff08;Information Gain&#xff09;作為特征選擇的標準&#xff0c;遞歸地構建決策樹。2. 特征選擇標準信息增益&#xff08;IG&#xff09;&#xff1a;選擇使信息增益最大的特征進行劃分。3. 優點算法簡單&#xff0c;易于理解。…

2025計算機視覺新技術

CLIP / BLIP-3 類「視覺-語言大模型」 ? 是什么&#xff1a;讓網絡自己學會“看圖說話”&#xff0c;zero-shot 就能分類、檢測、檢索。 ? 能干什么&#xff1a;不寫訓練代碼&#xff0c;直接一句中文 prompt 就把商品圖分成 500 類。 ? 落地難度&#xff1a;★☆☆&#xf…

[光學原理與應用-431]:非線性光學 - 能生成或改變激光波長的物質或元件有哪些?

要生成或改變激光波長&#xff0c;可依賴增益介質、非線性光學元件、調諧元件及特殊激光器設計&#xff0c;以下是一些關鍵物質和元件及其作用機制&#xff1a;一、增益介質&#xff1a;波長的“決定者”增益介質是激光器的核心&#xff0c;其原子或分子的能級結構直接決定輸出…

接口權限驗證有哪些方式

接口權限驗證是保障 API 安全的核心機制&#xff0c;常見的方式有以下幾類&#xff0c;適用于不同場景和安全需求&#xff1a; 1. 基于令牌&#xff08;token&#xff09;的驗證 &#xff08;1&#xff09;JWT&#xff08;JSON Web Token&#xff09; 原理&#xff1a; 服務器驗…