【設計模式-結構型】裝飾器模式

一、什么是裝飾器模式

????????裝飾器模式(Decorator Pattern)是一種結構型設計模式,它的核心思想是在不改變原有對象結構的情況下,動態地給對象增加一些功能,從而達到擴展功能的目的。舉個例子,今天在家媽媽給蒸饅頭。饅頭蒸的過程中,媽媽去收拾衣服了。突然想起來,饅頭好了,就跟你說:“幫我把饅頭拿出來。”這個時候饅頭特別燙,如果不燙其實用我們的手是可以拿出來的,但是這個時候光用手拿不行。所以我們想了個辦法,找了一個手套,從而把饅頭拿了出來。這個過程就類似于裝飾器模式,手套相當于裝飾器,給手(原有對象)增加了隔熱的功能,使得手能夠處理原本無法直接處理的燙饅頭。

二、為什么使用裝飾器模式

? ? ? ? 基于上面的饅頭場景,我們討論一下為什么使用裝飾器模式(為什么要戴手套):

  1. 動態擴展(撤銷)功能:當需要在運行時為對象動態添加功能時,裝飾器模式是一個很好的選擇。例如,比如應對熱饅頭去拿的時候要隔熱功能,不想隔熱還可以直接上手。但是裝飾的多了,手不熱嗎?手不累嗎?所示要適當添加。別為了拿饅頭裝了一堆東西反而得不償失。

  2. 避免子類爆炸:如果通過繼承來擴展功能,可能會導致子類數量急劇增加,使得系統變得復雜且難以維護。裝飾器模式可以避免這種情況,通過組合的方式動態添加功能(繼承關系的替代)。

  3. 保持原有接口不變:裝飾器模式可以在不改變原有對象接口的情況下,增加新的功能,這使得客戶端代碼可以透明地使用被裝飾的對象,而不需要修改客戶端代碼。(拿饅頭的手,拿的功能不變

三、裝飾器模式示例

  1. Component(抽象組件):定義了被裝飾對象的接口,所有具體的組件和裝飾器都實現這個接口。

    //我就是一個手,人們定義我叫手,收能拿東西
    public interface Hand {void pickUp(Object object) throws Exception;
    }
  2. ConcreteComponent(具體組件):實現了Component接口的具體組件,是被裝飾的對象。

    //我是一個赤裸裸真是長在身上的手,人們說手可以拿東西,我也可以
    public class BareHand implements Hand {@Overridepublic void pickUp(Object object) throws Exception {if (object instanceof HotBun) {throw new Exception("我擦,太熱了!");}System.out.println("Picked up " + object.getClass().getSimpleName() + " with bare hands.");}
    }
  3. Decorator(裝飾器抽象類):也實現了Component接口,持有一個Component對象的引用,通過組合的方式動態地為Component對象添加新的功能。

    //其實手上沒準可以加點東西 
    public abstract class HandDecorator implements Hand {protected Hand hand;public HandDecorator(Hand hand) {this.hand = hand;}@Overridepublic void pickUp(Object object) throws Exception {hand.pickUp(object);}
    }
  4. ConcreteDecorator(具體裝飾器):實現了Decorator的具體裝飾器,負責給Component對象添加具體的裝飾功能。

    //我是手套
    public class GloveDecorator extends HandDecorator {public GloveDecorator(Hand hand) {super(hand);}@Overridepublic void pickUp(Object object) throws Exception {System.out.println("戴上手套去拿 " + object.getClass().getSimpleName());hand.pickUp(object);}
    }
  5. 客戶端

    //我是一個熱饅頭
    public class HotBun {// 燙饅頭的具體實現
    }
    public class Main {public static void main(String[] args) {Hand bareHand = new BareHand();try {bareHand.pickUp(new HotBun());} catch (Exception e) {System.out.println(e.getMessage());}// 使用手套裝飾手Hand glovedHand = new GloveDecorator(bareHand);try {glovedHand.pickUp(new HotBun());} catch (Exception e) {System.out.println(e.getMessage());}}
    }//輸出
    我擦,太熱了!
    戴上手套去拿熱饅頭
    我擦,太熱了!

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

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

相關文章

redux 結合 @reduxjs/toolkit 的使用

1,使用步驟 使用React Toolkit 創建 counterStore(store目錄下) --> 為React注入store(src下面的index) --> React組件使用store中的數據(組件) 2,例如下面有一個簡單加減的…

動態規劃【打家劫舍】

今天和大家分享一下動態規劃當中的打家劫舍題目,希望在大家刷題的時候提供一些思路 打家劫舍1: 題目鏈接: 198. 打家劫舍 - 力扣(LeetCode) 題目描述: 你是一個專業的小偷,計劃偷竊沿街的房屋…

KVM創建ubuntu20.04虛機,部署K8S,再克隆出二份,做為Worker節點加入集群,通過Helm創建2個Pod,讓它們之間通過域名互訪

KVM創建ubuntu20.04虛機,部署K8S,再克隆出二份,做為Worker節點加入集群,通過Helm創建2個Pod,讓它們之間通過域名互訪 一.背景二.操作步驟1.安裝KVMA.在BIOS中開啟VT-dB.修改grub,開啟iommu在/etc/default/grub 中 GRUB_CMDLINE_LINUX行 添加 intel_iommuon iommupt重新創建引導…

【機器學習實戰入門項目】使用Python創建自己的表情符號

深度學習項目入門——讓你更接近數據科學的夢想 表情符號或頭像是表示非語言暗示的方式。這些暗示已成為在線聊天、產品評論、品牌情感等的重要組成部分。這也促使數據科學領域越來越多的研究致力于表情驅動的故事講述。 隨著計算機視覺和深度學習的進步,現在可以…

BEVFusion論文閱讀

1. 簡介 融合激光雷達和相機的信息已經變成了3D目標檢測的一個標準,當前的方法依賴于激光雷達傳感器的點云作為查詢,以利用圖像空間的特征。然而,人們發現,這種基本假設使得當前的融合框架無法在發生 LiDAR 故障時做出任何預測&a…

OSI七層協議——分層網絡協議

OSI七層協議,顧名思義,分為七層,實際上七層是不存在的,是人為的進行劃分,讓人更好的理解 七層協議包括,物理層(我),數據鏈路層(據),網絡層(網),傳輸層(傳輸),會話層(會),表示層(表),應用層(用)(記憶口訣->我會用表…

6. NLP自然語言處理(Natural Language Processing)

自然語言是指人類日常使用的語言,如中文、英語、法語等。 自然語言處理是人工智能(AI)領域中的一個重要分支,它結合了計算機科學、語言學和統計學的方法,通過算法對文本和語音進行分析,使計算機能夠理解、解…

Ubuntu使用指南

Ubuntu使用指南 一、Ubuntu虛擬機1、本地如何連接虛擬機,并設置虛擬機可以訪問外網 一、Ubuntu虛擬機 1、本地如何連接虛擬機,并設置虛擬機可以訪問外網 本地:WMware設置為橋接模式(此時虛擬機可以看作一臺獨立主機)…

【Mysql進階知識】Mysql 程序的介紹、選項在命令行配置文件的使用、選項在配置文件中的語法

目錄 一、程序介紹 二、mysqld--mysql服務器介紹 三、mysql - MySQL 命令行客戶端 3.1 客戶端介紹 3.2 mysql 客戶端選項 指定選項的方式 mysql 客戶端命令常用選項 在命令行中使用選項 選項(配置)文件 使用方法 選項文件位置及加載順序 選項文件語法 使用舉例&am…

wireshark抓路由器上的包 抓包路由器數據

文字目錄 抓包流程概述設置抓包配置選項 設置信道設置無線數據包加密信息設置MAC地址過濾器 抓取聯網過程 抓包流程概述 使用Omnipeek軟件分析網絡數據包的流程大概可以分為以下幾個步驟: 掃描路由器信息,確定抓包信道;設置連接路由器的…

【藍橋杯】43687.贏球票

題目描述 某機構舉辦球票大獎賽。獲獎選手有機會贏得若干張球票。 主持人拿出 N 張卡片(上面寫著 1?N 的數字),打亂順序,排成一個圓圈。 你可以從任意一張卡片開始順時針數數: 1,2,3 ? ? 如果數到的數字剛好和卡片上的數字…

SQL-leetcode—626. 換座位

626. 換座位 表: Seat -------------------- | Column Name | Type | -------------------- | id | int | | student | varchar | -------------------- id 是該表的主鍵(唯一值)列。 該表的每一行都表示學生的姓名和 ID。 ID 序列始終從 1 開始并連續…

微軟開源AI Agent AutoGen 詳解

AutoGen是微軟發布的一個用于構建AI Agent系統的開源框架,旨在簡化事件驅動、分布式、可擴展和彈性Agent應用程序的創建過程。 開源地址: GitHub - microsoft/autogen: A programming framework for agentic AI ?? PyPi: autogen-agentchat Discord: https://aka.ms/auto…

【Elasticsearch】全文搜索與相關性排序

🧑 博主簡介:CSDN博客專家,歷代文學網(PC端可以訪問:https://literature.sinhy.com/#/?__c1000,移動端可微信小程序搜索“歷代文學”)總架構師,15年工作經驗,精通Java編…

用css和html制作太極圖

目錄 css相關參數介紹 邊距 邊框 偽元素選擇器 太極圖案例實現、 代碼 效果 css相關參數介紹 邊距 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><style>*{margin: 0;padding: 0;}div{width: …

【React】插槽渲染機制

目錄 通過 children 屬性結合條件渲染通過 children 和 slot 屬性實現具名插槽通過 props 實現具名插槽 在 React 中&#xff0c;并沒有直接類似于 Vue 中的“插槽”機制&#xff08;slot&#xff09;。但是&#xff0c;React 可以通過 props和 children 來實現類似插槽的功能…

【Go】Go Gorm 詳解

1. 概念 Gorm 官網&#xff1a;https://gorm.io/zh_CN/docs/ Gorm&#xff1a;The fantastic ORM library for Golang aims to be developer friendly&#xff0c;這是官網的介紹&#xff0c;簡單來說 Gorm 就是一款高性能的 Golang ORM 庫&#xff0c;便于開發人員提高效率 那…

【MySQL實戰】mysql_exporter+Prometheus+Grafana

要在Prometheus和Grafana中監控MySQL數據庫&#xff0c;如下圖&#xff1a; 可以使用mysql_exporter。 以下是一些步驟來設置和配置這個監控環境&#xff1a; 1. 安裝和配置Prometheus&#xff1a; - 下載和安裝Prometheus。 - 在prometheus.yml中配置MySQL通過添加以下內…

【Apache Doris】周FAQ集錦:第 29 期

引言 歡迎查閱本周的 Apache Doris 社區 FAQ 欄目&#xff01; 在這個欄目中&#xff0c;每周將篩選社區反饋的熱門問題和話題&#xff0c;重點回答并進行深入探討。旨在為廣大用戶和開發者分享有關 Apache Doris 的常見問題。 通過這個每周 FAQ 欄目&#xff0c;希望幫助社…

Linux:文件描述符fd、系統調用open

目錄 一、文件基礎認識 二、C語言操作文件的接口 1.> 和 >> 2.理解“當前路徑” 三、相關系統調用 1.open 2.文件描述符 3.一切皆文件 4.再次理解重定向 一、文件基礎認識 文件 內容 屬性。換句話說&#xff0c;如果在電腦上新建了一個空白文檔&#xff0…