23種設計模式之一— — — —裝飾模式詳細介紹與講解

裝飾模式詳細講解

  • 一、定義
  • 二、裝飾模式結構
      • 核心思想
      • 模式角色
      • 模式的UML類圖
      • 應用場景
      • 模式優點
      • 模式缺點
  • 實例演示
      • 圖示
      • 代碼演示
      • 運行結果

一、定義

裝飾模式(別名:包裝器)
裝飾模式(Decorator Pattern)是結構型的設計模式,它允許在運行時動態地向對象添加新的職責或功能,同時保持對象的原始類不變。通過使用裝飾器模式,可以在不修改現有代碼的基礎上擴展對象的功能,

二、裝飾模式結構

核心思想

1.動態擴展:在不改變原類結構和繼承關系的情況下,動態地為對象添加功能。
2.包裝對象:通過創建一個包裝對象(裝飾器)來包裹真實對象,增加額外功能。
3.接口一致性:裝飾器與真實對象有相同的接口,確保客戶端能以相同的方式與兩者交互。
4.開閉原則:對擴展開放,對修改關閉。新的功能通過添加裝飾器實現,而不是修改原類。
5.靈活組合:允許通過組合多個裝飾器來創建功能更為豐富的對象

模式角色

1.抽象組件(Component):定義一個接口,用于規范準備接收附加責任的對象(即被裝飾對象)。
2.具體組件(ConcreteComponent):實現抽象組件接口,是裝飾器要裝飾的真實對象。
3.裝飾器(Decorator):持有一個抽象組件的引用,并繼承抽象組件的接口。它既可以使用所持有的引用調用被裝飾的組件的方法,也可以增加新的功能。
4.具體裝飾器(ConcreteDecorator):實現裝飾器接口并給具體組件添加職責。它通常包含對具體組件的引用,以及一個或多個用于增加功能的額外方法。
這些角色在裝飾模式中的交互方式是:

  • 抽象組件定義了所有裝飾器對象和被裝飾對象需要實現的接口。
  • 具體組件實現了抽象組件接口,是準備被裝飾的對象。
  • 裝飾器持有一個對抽象組件的引用,并且實現了抽象組件接口。它可以使用這個引用來調用被裝飾對象的方法,并在調用前后添加新的功能。
  • 具體裝飾器實現了裝飾器接口,并且給具體組件添加新的職責。它通常包含一個指向被裝飾對象的引用,以及用于實現附加功能的代碼。

模式的UML類圖

在這里插入圖片描述

應用場景

  • 當需要為單個對象提供多種不同的行為或者表現形式時。
  • 需要向一個已經存在的類中添加功能,但又不希望修改該類的源代碼或繼承其子類時
  • 組合對象:當需要組合多個對象來創建一個具有更多功能的對象時,裝飾模式是一個很好的選擇。通過遞歸組合方式,可以構建出一個具有多種功能的對象。例如,在文件系統中,文件夾可以被視為一個特殊的文件,它可以包含其他文件和文件夾。使用裝飾模式,可以將文件夾裝飾為一個包含額外功能的對象,如支持加密、壓縮等

模式優點

  • 動態地給對象添加功能,相比生成子類更加靈活、透明。
  • 無需修改原有類就可以擴展功能,符合開閉原則。
  • 裝飾器可以被組合,以便在運行時動態地、多次地添加多個職責。

模式缺點

  • 這種比繼承更加靈活機動的特性,也同時意味著更加多的復雜性。
  • 裝飾模式會導致設計中出現許多小類,如果過度使用,會使程序變得很復雜。
  • 不易調試:由于裝飾器模式涉及到多個對象的交互,調試可能會變得相對困難。特別是當裝飾器鏈很長時,追蹤請求和響應的路徑可能會變得復雜。

實例演示

圖示

雞腿堡應用:
在這里插入圖片描述

代碼演示

package ZhuangShiMoShi;public abstract class Humburger {protected String name;public String getName() {return name;}public abstract double getPrice();}package ZhuangShiMoShi;public class ChickenBurger extends Humburger {public ChickenBurger(){name="雞腿堡";}public double getPrice(){return 10;}}package ZhuangShiMoShi;public abstract class Condiment extends Humburger {protected Humburger humburger;public abstract String getName();}package ZhuangShiMoShi;public class Chilli extends Condiment {public Humburger hum;public Chilli(Humburger hum) {this.hum = hum;}@Overridepublic String getName() {// TODO Auto-generated method stubreturn hum.getName() + " 加辣椒";}@Overridepublic double getPrice() {// TODO Auto-generated method stubreturn hum.getPrice();}}package ZhuangShiMoShi;public class Lettuce extends Condiment {public Humburger hum;public Lettuce(Humburger hum) {this.hum = hum;}@Overridepublic String getName() {// TODO Auto-generated method stubreturn hum.getName()+" 加生菜";}@Overridepublic double getPrice() {// TODO Auto-generated method stubreturn hum.getPrice()+1.5;}}

測試類:

package ZhuangShiMoShi;public class Test {public static void main(String[] args) {Humburger hum = new ChickenBurger();System.out.println(hum.getName() + " 價錢:" + hum.getPrice());Lettuce lettuce=new Lettuce(hum);System.out.println(lettuce.getName()+" 價錢:"+lettuce.getPrice());Chilli chilli1=new Chilli(hum);System.out.println(chilli1.getName()+" 價錢:"+chilli1.getPrice());Chilli chilli2=new Chilli(lettuce);System.out.println(chilli2.getName()+" 價錢:"+chilli2.getPrice());}}

運行結果

在這里插入圖片描述

該代碼主體是雞腿堡,可以選擇通過添加生菜、醬、辣椒等等許多其他的配料,并根據選擇的配料計算相應的價格。
博主用心寫,讀者點關注;互動傳真情,知識不迷路

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

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

相關文章

LeetCode 每日一題 數學篇 2651.計算列車到站時間

給你一個正整數 arrivalTime 表示列車正點到站的時間(單位:小時),另給你一個正整數 delayedTime 表示列車延誤的小時數。 返回列車實際到站的時間。 注意,該問題中的時間采用 24 小時制。 int findDelayedArrivalTi…

學業輔導導師:文心一言智能體詳細介紹和開發

一、前言 本期題目 開發方向:學習成長類 解讀: AI技術在學習成長方向的應用正日益增多,本期賽題需圍繞該方向開發智能體包括但不限于:作文輔導助手、個性化學習助手、考試助手、各垂類教育內容專家等 二、我的智能體:學業輔導…

macbook中foxmail的通訊錄遷移

之前windows中用習慣了foxmail,換成macbook后,還是沿用foxmail。使用一段時間后,確實受不了foxmail的不便:1、版本比較低1.5.6,很多windows新版的功能都沒有;2、動不動莫名其妙崩潰,寫了半天的郵件,點擊發送就直接崩了,又得重新寫。 忍耐了幾個月后,下定決心換成網易…

2.10 mysql設置遠程訪問權限

2.10 mysql設置遠程訪問權限 目錄1. 管理員運行mysql命令窗口2. 使用 root 用戶重新登錄 MySQL3. 修改用戶權限4. 修改mysql安裝目錄下的my.ini 目錄 說明: Mysql8.0 設置遠程訪問權限 一、Mysql8.0 設置遠程訪問權限 1. 管理員運行mysql命令窗口 2. 使用 root 用…

matlab安裝及破解

一、如何下載 軟件下載鏈接,密碼:98ai 本來我想自己生成一個永久百度網盤鏈接的,但是: 等不住了,所以大家就用上面的鏈接吧。 二、下載花絮 百度網盤下載速度比上載速度還慢,我給充了個會員&#xff0c…

【1】:計算機圖形學概述

從技術角度講,什么是好的畫面呢? 看這個畫面是不是足夠亮,也就是全局光照做的夠好 什么是計算機圖形學? 使用計算機合成和操作可視信息。 應用場景 Video Games 游戲 Movie 電影 Animation 動畫 Design 設計:CAD等軟件相關…

修復CentOS 6.6服務器YUM和RPM功能異常的技術實踐20240523

修復CentOS 6.6服務器YUM和RPM功能異常的技術實踐 引言 在復雜的生產環境中,服務器的穩定性至關重要。近期,我們遇到了一臺CentOS 6.6服務器在執行yum update -y時被中斷,導致YUM和RPM功能異常的問題。本文將詳細介紹問題的診斷、解決過程以及…

java中變量名單獨占用一個空間嗎,為什么能直接使用變量名而不需要給java地址,變量名和地址之間有什么關系

在 Java 中,變量名不單獨占用存儲空間,但它們確實在內存中有對應的地址。為了理解這一點,我們需要深入了解變量名和內存地址之間的關系。 變量名與內存地址 變量名的作用: 在 Java 程序中,變量名是用于引用存儲在內存中的數據的…

git顯示提交次數

git shortlog 是一個特殊版本的 git log 命令,旨在創建發布公告。它將每個提交按作者分組,并顯示每個提交消息的第一行。這是一種快速查看不同作者在項目中的貢獻的方式。 以下是 git shortlog 的一些常用參數: -n 或 --numbered&#xff1…

Java多線程——Lambda表達式

λ希臘字母表中排序第十一位的字母,英語名稱為Lambda; 避免匿名內部類定義過多; 其實質屬于函數式編程的概念。 為什么要用Lambda表達式? 1. 避免匿名內部類定義過多; 2. 可以讓你的代碼看起來更簡潔; …

OpenAI 文生圖模型演進:DDPM、IDDPM、ADM、GLIDE、DALL-E 2、DALL-E 3

節前,我們星球組織了一場算法崗技術&面試討論會,邀請了一些互聯網大廠朋友、參加社招和校招面試的同學。 針對算法崗技術趨勢、大模型落地項目經驗分享、新手如何入門算法崗、該如何準備、面試常考點分享等熱門話題進行了深入的討論。 合集&#x…

WPF使用Prism實現簡單訂餐系統

新建wpf項目,nuget引入Prism.DryIoc,MaterialDesignThemes 引入后,修改App.xaml 前臺引入 xmlns:prism"http://prismlibrary.com/"和prism:PrismApplication App.xaml.cs App.xaml.cs繼承PrismApplication,重寫CreateS…

在線等!3damx渲染爆內存怎么辦?

在使用V-Ray進行CPU渲染時,復雜場景和高渲染設置可能會導致內存消耗過高,進而影響渲染速度,導致處理異常、機器停滯、應用程序崩潰等情況。 為機器配置更大的 RAM 始終是解決問題的最有效辦法,但如果出于預算等原因無法實現&…

Lua的幾個特殊用法

:/.的區別 詳細可以參考https://zhuanlan.zhihu.com/p/651619116。最重要的不同就是傳遞默認參數self。 通過.調用函數,傳遞self實例 通過 : 調用函數,傳遞self (不需要顯示的傳遞self參數,默認就會傳遞,但…

調出idea解決沖突界面

背景 我對idea使用不熟練,還是習慣用git bash來合并代碼,合并爆沖突后,我進入idea準備解決沖突,卻發現找不到解決沖突的界面。 解決 右擊idea中沖突的文件,將鼠標移動到菜單欄的git上,此時應該出現包含有…

Leecode熱題100--二分查找---33:搜索旋轉排序矩陣

題目: 整數數組 nums 按升序排列,數組中的值 互不相同 。 給你 旋轉后 的數組 nums 和一個整數 target ,如果 nums 中存在這個目標值 target ,則返回它的下標,否則返回 -1 。 思路: 此處采用容易理解的兩次…

端口掃描利器--nmap

目錄 普通掃描 幾種指定目標的方法 TCP/UDP掃描 端口服務掃描 綜合掃描 普通掃描 基于端口連接并響應(真實) ? nmap -sn 網段(0/24)-sn 幾種指定目標的方法 單個IP掃描 IP范圍掃描 掃描文件里的IP 掃描網段,(排除某IP) 掃描網段(排除某清單IP) TCP/UDP掃描 -sS …

linux中邏輯卷管理與擴展

邏輯卷管理與擴展 邏輯卷 作用: 1.整合分散的空間2.空間支持擴大 邏輯卷制作過程:將眾多的物理卷(PV)組建成卷組(VG),再從卷組中劃分出邏輯卷(LV) 邏輯卷的邏輯思路 …

哪些公司防泄密軟件最受歡迎?2024年防泄密軟件排行榜 |

在數字化時代,數據的安全性和保密性已成為企業運營和發展的關鍵要素。隨著技術的不斷進步,防泄密軟件逐漸成為了企業保護核心數據和知識產權的重要工具。在2024年,市場上涌現出了眾多防泄密軟件,它們各具特色,為企業的…

楊校老師課題之基于Idea的SSM實訓項目案例開發之在線手機商城開發(一)【非常適合初學者】

1.前期配置 2.開發涉及技術棧和工具 2.1 技術棧 后端: SSM前端:Html、CSS、BootStrap(官方定義好的CSS樣式)數據庫: MySQL 2.2 開發環境(工具) 進行本次開發,需要具備如下環境: JDK a. JDK8.0/1.8 b. 注意: 沒有JDK是無法運行IdeaIDEA a. …