【設計模式】裝飾者模式里Java實現

插: AI時代,程序員或多或少要了解些人工智能,前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家(前言 – 人工智能教程 )

堅持不懈,越努力越幸運,大家一起學習鴨~~~

裝飾者設計模式(Decorator Pattern)是一種結構型設計模式,允許你動態地將新行為添加到對象實例中。這種模式通過創建一個包裝類,也就是裝飾者,來包裹原始的類,并在不改變其接口的情況下,增加新的功能。在Java中,裝飾者模式廣泛應用于需要擴展對象功能或動態地為對象添加功能的場景。

裝飾者模式的基本結構

在裝飾者模式中,通常有四個角色:

  1. Component(組件接口):定義一個對象接口,可以動態地給這些對象添加職責。

  2. ConcreteComponent(具體組件):實現Component接口的具體對象,是被裝飾的原始對象。

  3. Decorator(裝飾者抽象類):實現Component接口,并持有一個Component對象引用。這個類可以為Component對象動態添加功能。

  4. ConcreteDecorator(具體裝飾者):擴展Decorator類的功能,具體實現裝飾功能。

示例:在Java中實現一個簡單的裝飾者模式

假設我們有一個基礎的咖啡接口和具體的咖啡實現類,然后我們想要為這些咖啡添加額外的調料(裝飾者),比如牛奶或者糖漿。

Step 1: 定義組件接口
// Component 接口
public interface Coffee {String getDescription();double getCost();
}
Step 2: 創建具體組件類
// ConcreteComponent 具體咖啡類
public class SimpleCoffee implements Coffee {@Overridepublic String getDescription() {return "Simple Coffee";}@Overridepublic double getCost() {return 1.0;}
}
Step 3: 定義裝飾者抽象類
// Decorator 裝飾者抽象類
public abstract class CoffeeDecorator implements Coffee {protected Coffee decoratedCoffee;public CoffeeDecorator(Coffee coffee) {this.decoratedCoffee = coffee;}public String getDescription() {return decoratedCoffee.getDescription();}public double getCost() {return decoratedCoffee.getCost();}
}
Step 4: 創建具體裝飾者類
// ConcreteDecorator 具體裝飾者類 - 牛奶
public class MilkDecorator extends CoffeeDecorator {public MilkDecorator(Coffee coffee) {super(coffee);}@Overridepublic String getDescription() {return super.getDescription() + ", with Milk";}@Overridepublic double getCost() {return super.getCost() + 0.5;}
}
Step 5: 使用裝飾者模式
public class DecoratorPatternExample {public static void main(String[] args) {// 創建基礎咖啡Coffee coffee = new SimpleCoffee();System.out.println("Cost: " + coffee.getCost() + "; Description: " + coffee.getDescription());// 加牛奶coffee = new MilkDecorator(coffee);System.out.println("Cost: " + coffee.getCost() + "; Description: " + coffee.getDescription());// 加糖漿coffee = new SyrupDecorator(coffee);System.out.println("Cost: " + coffee.getCost() + "; Description: " + coffee.getDescription());}
}

解釋說明:

  • SimpleCoffee 實現了 Coffee 接口,表示基礎的咖啡。

  • CoffeeDecorator 是裝飾者的抽象類,持有一個 Coffee 對象的引用,通過組合的方式擴展 Coffee 的功能。

  • MilkDecorator 和 SyrupDecorator 分別是具體的裝飾者類,通過繼承 CoffeeDecorator 并重寫相關方法,實現對咖啡的裝飾。

通過這種方式,我們可以動態地為咖啡添加不同的調料,而不需要修改原始的咖啡類。這種設計模式提供了靈活性和可擴展性,使得我們可以在運行時動態地添加功能,而不會影響到其他對象。

裝飾者模式在Java中的應用不僅局限于咖啡例子,還可以用于文件流處理、UI組件的動態功能添加等各種場景,是一種非常有用的設計模式。

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

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

相關文章

【VIM的使用】

Vim 是一個非常強大的文本編輯器,尤其在 Linux 環境下被廣泛使用。它基于 vi 編輯器開發而來,增加了許多功能和改進。下面是一個簡化的 Vim 教程,幫助你快速上手: 啟動 Vim 要啟動 Vim,只需在終端中輸入 vim [filen…

Leetcode刷題2---兩數相加 Python

目錄 題目及分析解法一: 迭代法解法二: 遞歸法解法三:反轉鏈表法 題目及分析 (力扣序號2:兩數相加) 給你兩個非空的鏈表,表示兩個非負的整數。它們每位數字都是按照逆序的方式存儲的,并且每個節點只能存儲…

python之音頻處理(2)兩個音頻文件的合并

from pydub import AudioSegment# 加載兩個音頻文件 audio1 AudioSegment.from_file(r"D:\websiteDownload\huanxing.wav") audio2 AudioSegment.from_file(r"D:\websiteDownload\我今天被一件事情搞得很煩.wav")# 設置間隔(單位:…

Altium Designer專業PCB設計軟件下載安裝 Altium Designer安裝包下載獲取

在電子設計的廣袤領域中,PCB設計無疑占據著重要的地位。而Altium Designer作為一款業界領先的電子設計自動化軟件,其提供的先進布局工具,無疑為設計師們打開了一扇通往高效、精確設計的大門。 在PCB設計的核心環節——布局中,Alti…

初學Spring之自動裝配 Bean

Bean 的作用域: 1.單例模式(Spring 默認機制) scope“singleton” 2.原型模式:每次從容器中 get 時,都會產生一個新對象 scope"prototype" 3. request、session、application,只能在 web 開…

《c語言結構體怎么函數傳參》

在C語言中,結構體(struct)是一種用戶自定義的數據類型,用于組合多個不同類型的數據成員。當你要將結構體作為參數傳遞給函數時,可以按照以下幾種方式進行: 值傳遞(Pass by Value)&a…

【pytorch擴展】CUDA自定義pytorch算子(簡單demo入手)

Pytorch作為一款優秀的AI開發平臺,提供了完備的自定義算子的規范。我們用torch開發時,經常會因為現有算子的不足限制我們idea的迸發。于是,CUDA/C自定義pytorch算子是不得不磕了。 今天通過一個小實驗來梳理自定義pytorch算子都需要做哪些準…

軟設之類的繼承與泛化,多重繼承

在類中,假如父類已經寫好屬性或方法,子類想要實現相同的功能,不用專門寫代碼,直接用專門的繼承語言繼承就可以了。 比如說有一個動物類,有毛色和叫這兩個屬性和方法,又寫了一個子類是貓類,貓類…

騰訊云COS分布式對象存儲

騰訊云COS分布式對象存儲 騰訊云對象存儲(Cloud Object Storage,COS)是騰訊云提供的一種用于存儲海量文件的分布式存儲服務。 騰訊云 COS 適用于多種場景,如靜態網站托管、大規模數據備份和歸檔、多媒體存儲和處理、移動應用數據存…

Kafka搭建(單機版)

部署前提 VMware環境 : 兩臺centos系統 Jdk包:jdk-8u202-linux-x64.tar.gz Kafka包:kafka_2.12-3.5.0.tgz Zookeeper包:apache-zookeeper-3.7.2-bin.tar.gz 百度網盤自取: 鏈接: https://pan.baidu.com/s/11EWuhBoSmH3musd_3Rgodw?pwde32t 提取碼: e32t Kafka搭建(…

Camtasia 2024新功能 Camtasia2024更新介紹:AI剪輯助力微課制作 Camtasia2024密鑰 Camtasia2023免費升級更新

Camtasia 是一款功能強大的屏幕錄制和視頻編輯軟件,廣泛應用于教育、商業和娛樂領域。無論是創建教學視頻、產品演示、教程還是營銷內容,Camtasia都能提供專業的工具和功能,幫助用戶制作高質量的視頻內容。 Camtasia 2024 中文免費安裝包百度…

暑假學習DevEco Studio第2天

學習目標: 掌握頁面跳轉 學習內容: 跳轉頁面 創建頁面: 在“project”窗口。打開“entry>src>main>ets”,右擊“pages”,選擇“New>ArkTS File”,命名“Second”,點擊回車鍵。 在頁面的路由&#xff0…

昇思25天學習打卡營第16天|文本解碼原理——以MindNLP為例

在大模型中,文本解碼通常是指在自然語言處理(NLP)任務中使用的大型神經網絡模型(如Transformer架構的模型)將編碼后的文本數據轉換回可讀的原始文本的過程。這些模型在處理自然語言時,首先將輸入文本&#…

【Unix/Linux】Unix/Linux如何查看系統版本

Unix和Linux查看系統版本的指令有些區別,下面分別介紹: 一.Unix查看系統版本 在Unix系統中,查看系統版本的方法可能會根據具體的Unix操作系統而有所不同。以下是一些通用的方法,適用于多種Unix系統,包括但不限于Solaris、AIX、H…

vienna整流器過零畸變原因分析

Vienna整流器是一種常見的三電平功率因數校正(PFC)整流器,廣泛應用于電源和電能質量控制領域。由于其高效率、高功率密度和低諧波失真的特點,Vienna整流器在工業和電力電子應用中具有重要地位。然而,在實際應用中&…

ssh:(xshell)遠程連接失敗

項目場景: 提示:這里簡述項目相關背景: 云服務器遠程連接失敗 xshell 遠程連接失敗 xshell (ssh客戶端) ---------------------------------------------安全組----------防火墻-------黑白名單-----SSH服務 問題排查 1. 安全…

Playwright之錄制腳本轉Page Object類

Playwright之錄制腳本轉Page Object類 設計思路 : 我們今天UI自動化設計的時候,通常會遵循一些設計模式,例如Page Object模式。但是自己找元素再去填寫有一些麻煩,所以我們可以通過拆解錄制的腳本,將其中的元素提取出來…

DALL-E、Stable Diffusion 等 20+ 圖像生成模型綜述

二、任務場景 2.1. 無條件生成 無條件生成是指生成模型在生成圖像時不受任何額外條件或約束的影響。模型從學習的數據分布中生成圖像,而不需要關注輸入條件。 2.2. 有條件生成 有條件生成是指生成模型在生成圖像時受到額外條件或上下文的影響。這些條件可以是類別…

Vscode 保存代碼,代碼自動格式化

我這里使用的插件是Prettier-Code formatter:自動縮進整理代碼的格式,使用方法如下: 先在vscode商店找到插件并安裝:安裝插件之后,隨便找到一個項目文件,右鍵選擇格式化文檔:選中我們安裝的插件…

掌握Vim的會話之道:深度解析會話管理功能

掌握Vim的會話之道:深度解析會話管理功能 在高效的文本編輯工作流中,能夠保存和恢復編輯會話是極其重要的。Vim,作為一個功能強大的文本編輯器,提供了會話管理功能,允許用戶保存當前的工作狀態,并在之后重…