設計模式筆記_結構型_裝飾器模式

1.裝飾器模式介紹

裝飾器模式是一種結構型設計模式,允許你動態地給對象添加行為,而無需修改其代碼。它的核心思想是將對象放入一個“包裝器”中,這個包裝器提供了額外的功能,同時保持原有對象的接口不變。

想象一下,你有一個簡單的咖啡,你想讓它變得更特別。你可以給它加奶、加糖、加香草等等,但咖啡本身還是咖啡。這些額外的東西不會改變咖啡的本質,只是讓它更豐富。

裝飾器模式有四個角色:

  1. 抽象組件(Component):可以是一個接口或者抽象類,規定了被裝飾對象的行為;
  2. 具體組件(ConcreteComponent):實現或繼承Component的一個具體對象,也即被裝飾對象
  3. 抽象裝飾器(Decorator):一般是抽象類, 繼承或實現抽象組件Component;其內部必然有一個屬性指向Component組件對象;通過其子類 ConcreteDecorator 擴展具體構件的功能。
  4. 具體裝飾器(ConcreteDecorator):Decorator的具體實現類,理論上每個ConcreteDecorator 都擴展了 Component 對象的一種功能;

四個角色的關系:

2.代碼演示

抽象組件(Component):咖啡接口定義了咖啡有“描述”和“價格”兩個方法

// 基礎接口
interface Coffee {String getDescription();double getCost();
}

具體組件(ConcreteComponent): 咖啡實現類,是需要被裝飾的對象

// 具體的咖啡類
class SimpleCoffee implements Coffee {@Overridepublic String getDescription() {return "Simple Coffee";}@Overridepublic double getCost() {return 5.0;}
}

抽象裝飾器(Decorator):抽象類,實現咖啡接口,內部有一個屬性指向Coffee對象

// 裝飾器基類
abstract class CoffeeDecorator implements Coffee {//內部必然有一個屬性指向Component組件對象protected Coffee coffee;public CoffeeDecorator(Coffee coffee) {this.coffee = coffee;}@Overridepublic String getDescription() {return coffee.getDescription();}@Overridepublic double getCost() {return coffee.getCost();}
}

具體裝飾器(ConcreteDecorator):每個Coffee裝飾器都擴展了Coffee對象的一種功能

// 具體的裝飾器類
class MilkDecorator extends CoffeeDecorator {public MilkDecorator(Coffee coffee) {super(coffee);}@Overridepublic String getDescription() {return coffee.getDescription() + ", Milk";}@Overridepublic double getCost() {return coffee.getCost() + 1.5;}
}class SugarDecorator extends CoffeeDecorator {public SugarDecorator(Coffee coffee) {super(coffee);}@Overridepublic String getDescription() {return coffee.getDescription() + ", Sugar";}@Overridepublic double getCost() {return coffee.getCost() + 0.5;}
}

使用裝飾器:每個裝飾器都可以單獨或組合使用,給咖啡增加不同的特性。通過這種方式,原來的咖啡類保持不變,而我們可以靈活地為它添加新功能

// 使用裝飾器模式
public class CoffeeShop {public static void main(String[] args) {//創建簡單的咖啡類SimpleCoffeeCoffee coffee = new SimpleCoffee();System.out.println(coffee.getDescription() + " $" + coffee.getCost());//通過裝飾器MilkDecorator給咖啡加奶coffee = new MilkDecorator(coffee);System.out.println(coffee.getDescription() + " $" + coffee.getCost());//通過裝飾器SugarDecorator給咖啡加糖coffee = new SugarDecorator(coffee);System.out.println(coffee.getDescription() + " $" + coffee.getCost());}
}

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

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

相關文章

day25 力扣90.子集II 力扣46.全排列 力扣47.全排列 II

子集II給你一個整數數組 nums ,找出并返回所有該數組中不同的遞增子序列,遞增子序列中 至少有兩個元素 。你可以按 任意順序 返回答案。數組中可能含有重復元素,如出現兩個整數相等,也可以視作遞增序列的一種特殊情況。示例 1&…

Solidity 中的`bytes`

在 Solidity 中,bytes 和 bytes32 都是用來保存二進制數據的類型,但它們的長度、使用場景、Gas 成本完全不同。? 一句話區分類型一句話總結bytes32定長 32 字節,適合做哈希、地址、標識符等固定長度數據。bytes動態長度字節數組,…

初學者STM32—PWM驅動電機與舵機

一、簡介 上一節課主要學習了輸出比較和PWM的基本原理和結構,本節課就主要以實踐為主通過STM32最小系統板和驅動器控制舵機和直流電機。 上一節課的坐標 初學者STM32—輸出比較與PWM-CSDN博客 二、舵機 舵機是一種根據輸入PWM信號占空比來控制輸出角度的裝置 輸…

C++中的異常處理機制:try-catch

一、基本概念 異常(Exception):程序執行過程中發生的非正常情況,比如除以零、訪問越界、內存不足等。 異常處理(Exception Handling):對異常情況進行捕獲、分析,并采取補救措施&…

如何從 Windows 11 或 10 遠程訪問 Ubuntu 24.04 或 22.04 桌面

了解如何使用 RDP(遠程桌面協議)從 Windows 11 或 10 遠程連接 Ubuntu 24.04 Noble 或 22.04 LTS Jammy JellyFish 桌面的步驟。 Windows 提供了一個便捷的功能,稱為遠程桌面連接,它使用 RDP 協議來遠程連接 PC。當從 Windows 系統建立遠程桌面連接時,使用起來非常簡單,…

Linux 服務器中,Tab 鍵自動補全功能失效

在 Linux 服務器中,Tab 鍵自動補全功能失效通常與 bash-completion 組件缺失或配置異常有關。以下是解決問題的兩個關鍵 YUM 指令及操作步驟:1. 安裝 bash-completion 組件 sudo yum install -y bash-completion說明: bash-completion 是提供…

SpringBoot服裝推薦系統實戰

Spring Boot 服裝推薦系統實例 以下是基于Spring Boot實現的服裝推薦系統的30個實例代碼示例,涵蓋核心功能和實現方法。 用戶注冊與登錄功能 @RestController @RequestMapping("/api/auth") public class AuthController {@Autowiredprivate UserService userSer…

WIN10系統優化篇(一)

你是否疑惑為什么別人家的電腦運行速度飛快,而自己的卻卡頓難用?其實,很多時候 Windows 系統可以通過簡單的優化措施來提升使用體驗。本文根據項目實戰多年對 Win10 優化經驗,將幫你找出系統卡頓的原因,并給出針對性的…

Flutter狀態管理篇之ChangeNotifier基礎篇(一)

目錄 前言 一、什么是ChangeNotifier 二、ChangeNotifier 的基本用法 三、結合Flutter UI 使用 四、結合 Provider 的高級用法 五、ChangeNotifier 的優勢與注意事項 5.1 優勢 5.2 注意事項 六、與 ValueNotifier 的比較 七、實際應用場景 八、總結 前言 在 Flutter…

react17更新哪些新特性

React 17 是一個“無新特性”的發布版本,它的主要目標是為未來的 React 版本打好基礎,同時改善與舊版本共存和升級的體驗。雖然沒有引入新的開發者 API,但它在內部做了很多重要的改進。以下是 React 17 的核心更新內容和特性:&…

Unity 常見數據結構分析與實戰展示 C#

Unity 常見數據結構分析與實戰展示 提示:內容純個人編寫,歡迎評論點贊,來指正我。 文章目錄Unity 常見數據結構分析與實戰展示1. 引言2. Unity 數據結構概述3. 常見數據結構1. 數組(Array)2. 列表(List&…

【Linux網絡編程】應用層協議 - HTTP

目錄 初識HTTP協議 認識URL HTTP協議的宏觀格式 Socket封裝 TcpServer HttpServer 整體設計 接收請求 web根目錄與默認首頁 發送應答 完善頁面 HTTP常見Header HTTP狀態碼 HTTP請求方法 cookie與session Connection 抓包 初識HTTP協議 應用層協議一定是基于…

技術演進中的開發沉思-36 MFC系列: 對話框

MFC這個章節里,不能忽視的是對話框的開發。如果把 MFC 程序比作一棟辦公樓,那對話框就是「會客室」—— 它是程序與用戶面對面交流的地方:用戶在這里輸入數據,程序在這里展示信息,彼此的互動都從這個空間開始。今天圍繞…

(李宏毅)deep learning(五)--learning rate

一,關于learning rate的討論:(1)在梯度下降的過程中,當我們發現loss的值很小的時候,這時我們可能以為gradident已經到了local min0(低谷),但是很多時候,loss很小并不是因…

pytorch:tensorboard和transforms學習

tensorboard:可視化數據 在anaconda安裝: pip install tensorboard2.12.0最好使用這個版本 不然后面調用會報錯 因為版本過高的原因 然后還碰到了安裝的時候 安裝到C盤去了 但是我用的虛擬環境是在E盤:此時去C盤把那些新安裝的復制過來就好了 附錄我C盤的…

常用的100個opencv函數

以下是OpenCV中最常用的100個函數及其作用與注意事項的全面整理,按功能模塊分類,結合官方文檔與工業實踐優化排序。各函數均標注Python(cv2)和C(cv::)命名,重點參數以加粗突出: &…

【C++】紅黑樹,詳解其規則與插入操作

各位大佬好,我是落羽!一個堅持不斷學習進步的大學生。 如果您覺得我的文章有所幫助,歡迎多多互三分享交流,一起學習進步! 也歡迎關注我的blog主頁: 落羽的落羽 一、紅黑樹的概念與規則 紅黑樹是一種更加特殊的平衡二…

Camera相機人臉識別系列專題分析之十七:人臉特征檢測FFD算法之libhci_face_camera_api.so 296點位人臉識別檢測流程詳解

【關注我,后續持續新增專題博文,謝謝!!!】 上一篇我們講了: 這一篇我們開始講: Camera相機人臉識別系列專題分析之十七:人臉特征檢測FFD算法之libhci_face_camera_api.so 296點位人臉識別檢測流程詳解 目錄 一、背景 二、:FFD算法libhci_face_camera_api.s…

PostgreSQL 16 Administration Cookbook 讀書筆記:第7章 Database Administration

編寫一個要么完全成功要么完全失敗的腳本 事務(transaction)可以實現all or nothing。不過這里指的是psql的-和--single-transaction選項。可以實現transaction wrapper: 此選項只能與一個或多個 -c 和/或 -f 選項組合使用。它會導致 psql 在…

DeepSeekMath:突破開源語言模型在數學推理中的極限

溫馨提示: 本篇文章已同步至"AI專題精講" DeepSeekMath:突破開源語言模型在數學推理中的極限 摘要 數學推理由于其復雜且結構化的特性,對語言模型構成了重大挑戰。本文介紹了 DeepSeekMath 7B,該模型在 DeepSeek-Code…