設計模式--》 裝飾模式的應用

裝飾模式的定義:

裝飾模式(Decorator Pattern)是一種結構型設計模式,它允許你動態地給一個對象添加一些額外的職責。就增加功能來說,裝飾模式相比生成子類更為靈活。

何時應用裝飾模式?

1.當需要動態地給一個對象增加功能時:如果你需要在運行時給一個對象增加新的職責,而不是在編譯時,那么裝飾模式是一個好的選擇。

2.當使用繼承會導致大量子類時:如果你使用繼承來擴展對象的功能,那么可能會產生大量的子類,導致系統難以管理和維護。使用裝飾模式可以避免這個問題。

3.當需要透明地增強對象的功能時:裝飾模式允許你透明地增強對象的功能,這意味著客戶端代碼可以像使用原始對象一樣使用裝飾后的對象,而不需要知道對象已經被裝飾了。

需要注意什么?

  1. 避免過度使用:雖然裝飾模式很靈活,但過度使用它可能會導致代碼變得復雜和難以理解。因此,在決定是否使用裝飾模式時,需要權衡其優點和缺點。

  2. 性能考慮:由于裝飾模式會在運行時動態地添加功能,因此可能會帶來一些性能開銷。如果性能是一個關鍵問題,那么需要仔細考慮是否使用裝飾模式。

  3. 設計好接口:裝飾模式依賴于良好的接口設計。如果接口設計得不好,那么裝飾模式可能會變得難以使用和維護。

重要的構造部分:

  1. 組件(Component):這是一個接口或抽象類,它定義了對象的核心職責。

  2. 具體組件(ConcreteComponent):這是實現了組件接口的具體類。

  3. 裝飾器(Decorator):這也是一個接口或抽象類,它實現了組件接口,并持有一個對組件對象的引用。裝飾器接口通常會增加一些新的方法或覆蓋組件接口中的方法,以提供額外的功能。

  4. 具體裝飾器(ConcreteDecorator):這是實現了裝飾器接口的具體類。具體裝飾器會持有對組件對象的引用,并在需要時調用組件對象的方法。同時,具體裝飾器還可以添加自己的功能。

  5. 客戶端(Client):客戶端代碼通過組件接口與對象交互,而不需要知道對象是否被裝飾了。

示例實現:

以下是一個簡單的裝飾模式示例,它模擬了一個咖啡訂單系統。在這個系統中,可以為咖啡添加不同的調料,如牛奶和糖,這些調料就是裝飾器。

首先,定義一個Beverage接口,它代表了一種飲料:

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

接著,創建一個實現了Beverage接口的DarkRoast類,它代表了一種深焙咖啡:

public class DarkRoast implements Beverage {  @Override  public String getDescription() {  return "Dark Roast Coffee";  }  @Override  public double cost() {  return 1.99;  }  
}

現在創建一個CondimentDecorator抽象類,它實現了Beverage接口并持有一個Beverage對象的引用。這個類將作為所有裝飾器的基類:

public abstract class CondimentDecorator implements Beverage {  protected Beverage beverage;  public CondimentDecorator(Beverage beverage) {  this.beverage = beverage;  }  @Override  public String getDescription() {  return beverage.getDescription();  }  @Override  public double cost() {  return beverage.cost();  }  
}

接下來創建兩個具體的裝飾器類:Milk和Sugar,它們分別表示加牛奶和加糖的調料:


//milk類
public class Milk extends CondimentDecorator {  public Milk(Beverage beverage) {  super(beverage);  }  @Override  public String getDescription() {  return beverage.getDescription() + ", Milk";  }  @Override  public double cost() {  return beverage.cost() + 0.20; // 假設加牛奶要額外收費0.2美元  }  
}  //suger類 
public class Sugar extends CondimentDecorator {  public Sugar(Beverage beverage) {  super(beverage);  }  @Override  public String getDescription() {  return beverage.getDescription() + ", Sugar";  }  @Override  public double cost() {  return beverage.cost() + 0.10; // 假設加糖要額外收費0.1美元  }  
}

最后創建一個客戶端類來演示如何使用裝飾模式:

public class CoffeeShop {  public static void main(String[] args) {  Beverage beverage = new DarkRoast();  System.out.println(beverage.getDescription() + " $" + beverage.cost());  Beverage beverageWithMilk = new Milk(new DarkRoast());  System.out.println(beverageWithMilk.getDescription() + " $" + beverageWithMilk.cost());  Beverage beverageWithSugarAndMilk = new Milk(new Sugar(new DarkRoast()));  System.out.println(beverageWithSugarAndMilk.getDescription() + " $" + beverageWithSugarAndMilk.cost());  }  
}

最后運行代碼會顯示:

Dark Roast Coffee $1.99  
Dark Roast Coffee, Milk $2.19  
Dark Roast Coffee, Sugar, Milk $2.29

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

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

相關文章

《C語言深度解剖》(15):動態內存管理和柔性數組

🤡博客主頁:醉竺 🥰本文專欄:《C語言深度解剖》 😻歡迎關注:感謝大家的點贊評論關注,祝您學有所成! ??💜💛想要學習更多C語言深度解剖點擊專欄鏈接查看&…

k8s中的集群調度

文章目錄 k8s中的集群調度Pod 創建流程 通過指定節點來創建pod所在的node節點通過標簽來指定pod創建在哪個節點上pod 的親和性Pod的親和性和反親和性親和性(Affinity)反親和性(Anti-Affinity) 污點與容忍污點(Taint&am…

Spring Cache入門詳解

一、概述 1.1緩存介紹 Spring提供了一套cache緩存抽象(注解/接口),使基于spring緩存的使用與實現解耦 默認實現,Spring JDK ConcurrentMap-based Cache第三方實現,caffeine/Ehcache/Redis等 https://docs.spring.io/spring-framework/do…

Postman快捷功能-快速填寫請求頭

大家好,之前給大家分享關于 Postman 工具的基礎使用,今天給大家介紹一個快捷功能,可以一定程度提高我們使用 Postman 工具的效率,在我們進行接口測試時,幾乎每個接口都需要填寫 Headers,且 Headers 中的參數…

【ai】livekit服務本地開發模式2:模擬1個發布者

是一個會議用軟件:LiveKit is an open source project that provides scalable, multi-user conferencing based on WebRTC. It’s designed to provide everything you need to build real-time video audio data capabilities in your applications.LiveKit’s server is wr…

【Python】 Django 框架如何支持百萬級日訪問量

基本原理 Django 是一個高級的 Python Web 框架,它鼓勵快速開發和干凈、實用的設計。Django 遵循 MVC(模型-視圖-控制器)設計模式,允許開發者通過編寫更少的代碼來構建高質量的 Web 應用程序。Django 自帶了許多內置功能&#xf…

發現沒:隨便搞個B端頁面,就想在客戶那里過關,難啦。

客戶對B端界面要求越來越高的原因可以有以下幾點: 用戶體驗要求提升:隨著用戶對移動應用和網頁的使用經驗增加,他們對于界面的交互、流暢性和易用性要求也越來越高。他們希望能夠在使用B端應用時,能夠快速、方便地完成任務&#…

2024年華為OD機試真題-文本統計分析-C++-OD統一考試(C卷D卷)

題目描述: 有一個文件, 包含以一定規則寫作的文本, 請統計文件中包含的文本數量 規則如下 1. 文本以";"分隔,最后一條可以沒有";",但空文本不能算語句,比如"COMMAND A; ;"只能算一條語句. 注意, 無字符/空白字符/制表符都算作"空&qu…

設計模式詳解(六):適配器模式——Adapter

目錄導航 適配器模式及其作用現實生活舉例 適配器模式的好處適配器模式的實現關系圖實現步驟 適配器模式的適用場景適配器模式示例 適配器模式及其作用 適配器模式是一種結構型設計模式。所謂結構型是指在代碼結構方面的設計模式。適配器模式作為中間層,可以讓交互…

Vue3 圖片或視頻下載跨域或文件損壞的解決方法

Vue3 圖片或視頻下載跨域或文件損壞的解決方法 修改跨域配置文件下載方法 修改跨域配置文件 修改vite.config.ts文件proxy里面寫跨域地址,如下圖,圖片地址就是我們要跨域的目標地址: 下載方法 如下就是我取消上面那句后的報錯 然后調用兩…

【C++風云錄】C++與智能交通:智能交通系統與車聯網

解鎖C的力量:在智能交通系統與車聯網中使用關鍵庫 前言 本文關注于C在智能交通系統與車聯網中的應用,并提供了五個常見庫的簡介和使用方法。這些庫包括:Veins, SUMO-GUI, OMNeT, NS-3和PLEXE,每個庫都有其獨特的功能和優點&…

【Java】Sping Boot中使用Javax Bean Validation

目錄 Javax Bean Validation在Spring Boot中集成Javax Bean Validation使用案例功能測試配置全局異常處理器重新測試返回特定形式的信息方式一方式二 附:常用的注解 Javax Bean Validation Javax Bean Validation是Java平臺的一項規范,旨在提供一種簡單…

想知道股指期貨和期權有什么不同嗎?

市場上目前有中金所的滬深300ETF,中證500和中證1000股指期貨,期權市場有上證50ETF,滬深300etf和中證500ETF期權,股指期貨和期權在買賣雙方的權利義務、風險收益特征、保證金制度、上市合約數量等方面均有較大區別,下文…

每天學點小知識:Windows終端Powershell美化

前言 本章的旨在教會你美化自己的終端,powershell需要以管理員運行 經過我的測試,不同的電腦可能會有不同的報錯,具體操作根據官方為主https://ohmyposh.dev/docs 效果展示 Oh My Posh:提供美觀的 PowerShell 提示符主題 1.安裝…

揭秘CISA:你不知道的信息安全認證,輕松掌握職場先機!

在當今的信息化時代,信息系統的安全和穩定是企業和組織的重要資產。信息系統審計是一項專業的工作,需要具備豐富的知識和經驗,以及敏銳的洞察力和判斷力。信息系統審計師是信息系統審計領域的專業人士,他們負責對信息系統的設計、…

MVVM模式的優點以及與MVC模式的區別?

1.MVVM 模式的優點: 1 、低耦合: 視圖( View )可以獨?于 Model 變化和修改,?個 ViewModel 可以綁定到不同的 "View" 上,當 View 變化的時候 Model 可以不變,當 Model 變化的時…

【OpenGL實踐12】關于緩存區Framebuffer的運用

文章目錄 一、說明二、幀緩沖區三、創建新的幀緩沖區四、附屬裝飾4.1 紋理圖像4.2 渲染緩沖區對象圖像 五、使用幀緩沖區5.1 后期處理5.2 更改代碼 六、后期處理效果6.1 色彩處理6.2 模糊6.3 Sobel算子 七、結論練習 一、說明 關于FrameBuffer的使用,是OpenGL的高級…

橫截面分位數回歸

一、分位數回歸簡介 分位數回歸(英語:Quantile regression)是回歸分析的方法之一。最早由Roger Koenker和Gilbert Bassett于1978年提出。一般地,傳統的回歸分析研究自變量與因變量的條件期望之間的關系,相應得到的回歸…

AI時代的服裝設計師--AIGC

AI時代的服裝設計師--AIGC AIGCAIGC設計能替代真正的設計師嗎森馬T恤設計AIGC優勢、優化 本文記錄于去年參加的一次森馬T恤設計活動的感受。 AIGC 可以說,近期以來,隨著ChatGPT的不斷發展,從ChatGPT-3到ChatGPT-4的飛速發展,AIGC…

Windows和Linux系統部署Docker(2)

目錄 一、Linux系統部署docker 前置環境: 1.安裝需要的軟件包, yum-util 提供yum-config-manager功能 2.添加阿里云 docker-ce 倉庫 3.安裝docker軟件包 4.啟動 docker并設置開機自啟 5.查看版本: 二、windows系統部署docker 1.查看…