23種設計模式-結構型模式之裝飾器模式(Java版本)

Java 裝飾器模式(Decorator Pattern)詳解

🎁 什么是裝飾器模式?

裝飾器模式是一種結構型設計模式,允許向一個對象動態添加新的功能,而不改變其結構。

🧱 你可以想象成在原有功能上“包裹”一層新功能,就像“套娃”或者“包禮物”。


🧠 使用場景

  • 需要在不修改類的情況下,擴展其功能
  • 需要動態地為對象添加功能
  • 多個類只有少量差異時,使用繼承會導致類爆炸

🏗? 模式結構

  • Component(抽象構件):定義對象接口
  • ConcreteComponent(具體構件):被裝飾的原始對象
  • Decorator(裝飾器抽象類):持有組件對象的引用,擴展功能
  • ConcreteDecorator(具體裝飾器):實現具體增強功能

? 示例:咖啡加配料

抽象組件

public interface Coffee {String getDescription();double cost();
}

具體組件

public class SimpleCoffee implements Coffee {@Overridepublic String getDescription() {return "普通咖啡";}@Overridepublic double cost() {return 5.0;}
}

抽象裝飾器

public abstract class CoffeeDecorator implements Coffee {protected Coffee decoratedCoffee;public CoffeeDecorator(Coffee coffee) {this.decoratedCoffee = coffee;}@Overridepublic String getDescription() {return decoratedCoffee.getDescription();}@Overridepublic double cost() {return decoratedCoffee.cost();}
}

具體裝飾器:加牛奶

public class MilkDecorator extends CoffeeDecorator {public MilkDecorator(Coffee coffee) {super(coffee);}@Overridepublic String getDescription() {return super.getDescription() + " + 牛奶";}@Overridepublic double cost() {return super.cost() + 2.0;}
}

具體裝飾器:加糖

public class SugarDecorator extends CoffeeDecorator {public SugarDecorator(Coffee coffee) {super(coffee);}@Overridepublic String getDescription() {return super.getDescription() + " + 糖";}@Overridepublic double cost() {return super.cost() + 1.0;}
}

客戶端使用

public class Main {public static void main(String[] args) {Coffee coffee = new SimpleCoffee();coffee = new MilkDecorator(coffee);coffee = new SugarDecorator(coffee);System.out.println(coffee.getDescription() + ",價格:" + coffee.cost());}
}

🧩 優點

  • 靈活、可擴展性強,支持動態組合
  • 避免類繼承造成的類爆炸
  • 滿足開閉原則

?? 缺點

  • 多層裝飾器會增加系統復雜度,調試不易
  • 對象結構可能過于復雜,難以理解

? 使用建議

  • 當你希望在運行時增加對象行為,而不是通過繼承
  • 多個類之間功能相似,可通過組合代替繼承

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

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

相關文章

解決模擬器打開小紅書設備異常問題

解決模擬器打開小紅書設備異常問題 解決模擬器打開小紅書設備異常問題和無法打開問題 解決模擬器打開小紅書設備異常問題和無法打開問題 問題描述 最近有用戶反饋在模擬器上無法正常登錄和打開小紅書APP,系統提示"設備異常"錯誤。本文將詳細介紹如何通過…

論文閱讀:2025 arxiv AI Alignment: A Comprehensive Survey

總目錄 大模型安全相關研究:https://blog.csdn.net/WhiffeYF/article/details/142132328 AI Alignment: A Comprehensive Survey 人工智能對齊:全面調查 https://arxiv.org/pdf/2310.19852 https://alignmentsurvey.com/ https://www.doubao.com/cha…

精益數據分析(1/126):從《精益數據分析》探尋數據驅動增長之道

精益數據分析(1/126):從《精益數據分析》探尋數據驅動增長之道 在當今數字化時代,數據無疑是企業發展的關鍵驅動力,對于競爭激烈的程序化廣告行業更是如此。最近我在研讀《精益數據分析》這本書,收獲頗豐&…

第五節:React Hooks進階篇-如何用useMemo/useCallback優化性能

反模式:濫用導致的內存開銷React 19編譯器自動Memoization原理 React Hooks 性能優化進階:從手動到自動 Memoization (基于 React 18 及以下版本,結合 React 19 新特性分析) 一、useMemo/useCallback 的正確使用場景…

windows server C# IIS部署

1、添加IIS功能 windows server 2012、windows server 2016、windows server 2019 說明:自帶的是.net 4.5 不需要安裝.net 3.5 盡量使用 windows server 2019、2016高版本,低版本會出現需要打補丁的問題 2、打開IIS 3、打開iis應用池 .net 4.5 4、添…

Elasticsearch的Java客戶端庫QueryBuilders查詢方法大全

matchAllQuery 使用方法:創建一個查詢,匹配所有文檔。 示例:QueryBuilders.matchAllQuery() 注意事項:這種查詢不加任何條件,會返回索引中的所有文檔,可能會影響性能,特別是文檔數量很多時。 ma…

C#進階學習(六)單向鏈表和雙向鏈表,循環鏈表(下)循環鏈表

目錄 📊 鏈表三劍客:特性全景對比表 一、循環鏈表節點類 二、循環鏈表的整體設計框架 三、循環列表中的重要方法: (1)頭插法,在頭結點前面插入新的節點 (2)尾插法實現插入元素…

交換網絡基礎

學習目標 掌握交換機的基本工作原理 掌握交換機的基本配置 交換機的基本工作原理 交換機是局域網(LAN)中實現數據高效轉發的核心設備,工作在 數據鏈路層(OSI 模型第二層),其基本工作原理可概括為 “學習…

科學研究:怎么做

科研(科學研究)?? 是指通過系統化的方法,探索自然、社會或人文領域的未知問題,以發現新知識、驗證理論或解決實際問題的活動。它的核心是??基于證據的探索與創新??,旨在推動人類認知和技術的進步。 科研的核心要…

算法題(128):費解的開關

審題: 本題需要我們將多組測試用例中拉燈數小于等于6的最小拉燈數輸出,若拉燈數最小值仍大于6,則輸出-1 思路: 方法一:二進制枚舉 首先我們先分析一下基本特性: 1.所有的燈不可能重復拉:若拉的數…

MFC文件-屏幕錄像

下載本文件 本文件將獲取屏幕圖像數據的所有代碼整合到兩個文件中(ScreenRecorder.h和ScreenRecorder.cpp),使獲取屏幕圖像數據變得簡單。輸出IYUV視頻流。還可以獲取系統播放的聲音,輸出PCM音頻流。由于使用了MFC類,本…

0801ajax_mock-網絡ajax請求1-react-仿低代碼平臺項目

0 vite配置proxy代理 vite.config.ts代碼如下圖所示: import { defineConfig } from "vite"; import react from "vitejs/plugin-react";// https://vite.dev/config/ export default defineConfig({plugins: [react()],server: {proxy: {&qu…

JVM筆記【一】java和Tomcat類加載機制

JVM筆記一java和Tomcat類加載機制 java和Tomcat類加載機制 Java類加載 * loadClass加載步驟類加載機制類加載器初始化過程雙親委派機制全盤負責委托機制類關系圖自定義類加載器打破雙親委派機制 Tomcat類加載器 * 為了解決以上問題,tomcat是如何實現類加載機制的…

IP編址(來自YESLAB新網工的筆記)

上層協議類型 概念:通常指的是位于網絡層(如 IP 層)以上的協議類型,這些協議在數據傳輸時需要由網絡層(或更低層)協議承載。以 IP 協議為例,IP 報文頭部中的 協議字段(Protocol Fie…

SpringBoot學習(過濾器Filter。攔截器Interceptor。全局異常捕獲處理器GlobalExceptionHandler)(詳細使用教程)

目錄 一、過濾器Filter。 1.1定義與規范。 1.2工作原理與范圍。 1.3使用場景。 1.4 SpringBoot實現過濾器。&#xff08;Filter配置2種方式&#xff09; <1>注解配置(WebFilter、Order、ServletComponentScan)。 創建過濾器類。 啟用 Servlet 組件掃描。 <2>配置類…

c++題目_P1443 馬的遍歷

P1443 馬的遍歷 # P1443 馬的遍歷 ## 題目描述 有一個 $n \times m$ 的棋盤&#xff0c;在某個點 $(x, y)$ 上有一個馬&#xff0c;要求你計算出馬到達棋盤上任意一個點最少要走幾步。 ## 輸入格式 輸入只有一行四個整數&#xff0c;分別為 $n, m, x, y$。 ## 輸出格式 …

清華《數據挖掘算法與應用》K-means聚類算法

使用k均值聚類算法對表4.1中的數據進行聚類。代碼參考P281。 創建一個名為 testSet.txt 的文本文件&#xff0c;將以下內容復制粘貼進去保存即可&#xff1a; 0 0 1 2 3 1 8 8 9 10 10 7 表4.1 # -*- coding: utf-8 -*- """ Created on Thu Apr 17 16:59:58 …

HarmonyOS-ArkUI V2工具類:AppStorageV2:應用全局UI狀態存儲

AppStorageV2是一個能夠跨界面存儲數據,管理數據的類。開發者可以使用AppStorageV2來存儲全局UI狀態變量數據。它提供的是應用級的全局共享能力,開發者可以通過connect綁定同一個key,進行跨ability數據共享。 概述 AppStorageV2是一個單例,創建時間是應用UI啟動時。其目的…

打靶日記 zico2: 1

一、探測靶機IP&#xff08;進行信息收集&#xff09; 主機發現 arp-scan -lnmap -sS -sV -T5 -p- 192.168.10.20 -A二、進行目錄枚舉 發現dbadmin目錄下有個test_db.php 進入后發現是一個登錄界面&#xff0c;嘗試弱口令&#xff0c;結果是admin&#xff0c;一試就出 得到加…

使用Java基于Geotools的SLD文件編程式創建與磁盤生成實戰

前言 在地理信息系統&#xff08;GIS&#xff09;領域&#xff0c;地圖的可視化呈現至關重要&#xff0c;而樣式定義語言&#xff08;SLD&#xff09;文件為地圖元素的樣式配置提供了強大的支持。SLD 能夠精確地定義地圖圖層中各類要素&#xff08;如點、線、面、文本等&#x…