23種設計模式-裝飾器(Decorator)設計模式

裝飾器設計模式

  • 🚩什么是裝飾器設計模式?
  • 🚩裝飾器設計模式的特點
  • 🚩裝飾器設計模式的結構
  • 🚩裝飾器設計模式的優缺點
  • 🚩裝飾器設計模式的Java實現
  • 🚩代碼總結
  • 🚩總結

🚩什么是裝飾器設計模式?

裝飾器設計模式(Decorator Pattern) 是一種 結構型設計模式,它允許你通過將對象放入 特殊封裝對象 中來為原對象 動態添加新的行為。裝飾器模式的核心思想是 在不改變原對象結構的情況下,擴展其功能

使用場景

  • 當需要 動態地添加或撤銷對象的功能 時。

  • 繼承不適合擴展功能 時(例如,子類數量爆炸或功能組合復雜)。

  • 當需要 為對象添加多個獨立的功能,且這些功能可以自由組合時。

🚩裝飾器設計模式的特點

  • 動態擴展:裝飾器模式允許在運行時動態地為對象添加功能。

  • 靈活性:可以自由組合多個裝飾器,實現功能的疊加。

  • 避免繼承:通過組合替代繼承,避免子類數量爆炸。

  • 透明性:裝飾器對象與原對象具有相同的接口,客戶端無需知道是否被裝飾。

🚩裝飾器設計模式的結構

裝飾器模式主要包含以下部分:

  • Component(抽象組件):定義對象的接口,可以是抽象類或接口。

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

  • Decorator(抽象裝飾器):繼承或實現 Component,并持有一個 Component 對象的引用。

  • ConcreteDecorator(具體裝飾器):實現 Decorator,為 Component 添加新的行為。

圖例:

在這里插入圖片描述

🚩裝飾器設計模式的優缺點

? 優點

  • 動態擴展:可以在運行時動態地為對象添加功能。

  • 靈活性:可以自由組合多個裝飾器,實現功能的疊加。

  • 避免繼承:通過組合替代繼承,避免子類數量爆炸。

  • 透明性:裝飾器對象與原對象具有相同的接口,客戶端無需知道是否被裝飾。

? 缺點

  • 復雜性:裝飾器模式會增加系統的復雜性,尤其是在多層裝飾時。

  • 調試困難:由于裝飾器是動態添加的,調試時可能難以追蹤具體的裝飾邏輯。

🚩裝飾器設計模式的Java實現

代碼地址:GitHub

  • 創建 抽象組件 Person,定義對象的接口。
/*** @author hanson.huang* @version V1.0* @ClassName Person* @Description 抽象組件 Person* @date 2025/3/24 15:35**/
public abstract class Person {protected String name;public abstract void Operation();// 職責
}
  • 創建 具體組件 Student,實現 Person 接口。
/*** @author hanson.huang* @version V1.0* @ClassName Student* @Description 具體組件* @date 2025/3/24 15:41**/
public class Student extends Person {public Student(String name) {this.name = name;}@Overridepublic void Operation() {System.out.println(name + "的職責:學習 ");}
}
  • 創建 抽象裝飾器 Decorator,繼承 Person 并持有一個 Person 對象的引用
/*** @author hanson.huang* @version V1.0* @ClassName Decorator* @Description 抽象裝飾器* @date 2025/3/24 15:42**/
public abstract class Decorator extends Person {protected Person person;
}
  • 創建 具體裝飾器 DecoratorADecoratorB,分別實現新的行為。

    • DecoratorA
    /*** @author hanson.huang* @version V1.0* @ClassName DecoratorA* @Description 具體裝飾器 DecoratorA* @date 2025/3/24 15:42**/
    public class DecoratorA extends Decorator {public DecoratorA(Person person) {this.person = person;}@Overridepublic void Operation() {// 職責person.Operation();// 原本的職責System.out.print("寫作業 ");}
    }
    
    • DecoratorB
    /*** @author hanson.huang* @version V1.0* @ClassName DecoratorB* @Description 具體裝飾器 DecoratorB* @date 2025/3/24 15:45**/
    public class DecoratorB extends Decorator {public DecoratorB(Person person) {this.person = person;}@Overridepublic void Operation() {// 職責person.Operation(); // 原本的職責System.out.print("考試 ");}
    }
    
  • 測試裝飾器模式

/*** @author hanson.huang* @version V1.0* @ClassName DecoratorPattern* @Description 測試裝飾器模式* @date 2025/3/24 15:46**/
public class DecoratorPattern {public static void main(String[] args) {Person zhangsan = new Student("張三");zhangsan= new DecoratorA(zhangsan);zhangsan= new DecoratorB(zhangsan);zhangsan.Operation();System.out.println("\n=====我是分割線=====");// 對象鏈Person lisi = new DecoratorB(new DecoratorA(new Student("李四")));lisi.Operation();}
}

📌 運行結果

在這里插入圖片描述

🚩代碼總結

  • 抽象組件 Person 定義對象的接口。

  • 具體組件 Student 實現 Person 接口,是被裝飾的原始對象。

  • 抽象裝飾器 Decorator 繼承 Person 并持有一個 Person 對象的引用

  • 具體裝飾器 DecoratorA 和 DecoratorB 分別實現新的行為。

  • 客戶端 通過組合裝飾器動態擴展對象的功能。

🚩總結

  • 裝飾器設計模式(Decorator Pattern) 允許你通過將對象放入 特殊封裝對象 中來為原對象 動態添加新的行為

  • 適用于 動態擴展對象功能避免繼承導致的子類數量爆炸自由組合多個功能 的場景。

  • Java 實現 需要 定義抽象組件具體組件抽象裝飾器具體裝飾器,并通過組合方式動態擴展功能。

? 適用場景:

  • 需要 動態地添加或撤銷對象的功能 時。

  • 繼承不適合擴展功能 時。

  • 需要 為對象添加多個獨立的功能,且這些功能可以自由組合時

  • Java中許多地方用到了裝飾器模式,例如,I/O流中的InputStream就是抽象的基礎組件,而,BufferedInputStreamDataInputStream 屬于是裝飾器類。Java的Collections 集合類Collections.synchronizedList 方法返回的列表是裝飾后的組件,它具備了線程安全的特性

在這里插入圖片描述

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

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

相關文章

[Vue]事件修飾符

文章目錄 一、語法介紹二、添加代碼三、結果展示四、參考文獻 如有錯誤,請指正!!! 一、語法介紹 1、問題來源 我們在處理網頁時,當點擊按鈕時會觸發對應事件,但是有時并不想觸發該時間&#xff0c…

Go 語言 sync 包使用教程

Go 語言 sync 包使用教程 Go 語言的 sync 包提供了基本的同步原語,用于在并發編程中協調 goroutine 之間的操作。 1. 互斥鎖 (Mutex) 互斥鎖用于保護共享資源,確保同一時間只有一個 goroutine 可以訪問。 特點: 最基本的同步原語&#x…

ubuntu22.04安裝搜狗輸入法保姆教程~

一、添加中文語言支持 1.首先打開設置,找到Language and Region 2.點擊Manage Installed Languages 3.點擊 Install/Remove Languages... 4.選中Chinese (simplified),點擊Apply

docker中間件部署

1.docker安裝 # 1.卸載舊版本 yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine# 2.需要的安裝包 yum install -y yum-utils# 3.設置鏡像的倉庫 # 3.1.默認是國外的&#x…

python康復日記-request庫的使用,爬蟲自動化測試

一,request的簡單應用 #1請求地址 URLhttps://example.com/login #2參數表單 form_data {username: admin,password: secret } #3返回的響應對象response response requests.post(URL,dataform_data,timeout5 ) #4處理返回結果,這里直接打印返回網頁的…

強化學習和智能決策:Q-Learning和Deep Q-Learning算法

強化學習(Reinforcement Learning, RL)是機器學習的一個重要分支,它通過智能體(Agent)與環境交互來學習最優決策策略,旨在最大化智能體的長期累積獎勵。Q-Learning和Deep Q-Learning是強化學習中的兩種關鍵算法,它們在智能決策領域發揮著重要作用。 一、強化學習基礎 …

ubuntu22.04 安裝Jitsi meet 開源會議系統,代替騰訊會議

0.安裝 官方安裝教程Self-Hosting Guide - Debian/Ubuntu server | Jitsi Meet 一定要用域名訪問, 一定要用域名訪問, 一定要用域名訪問, 一定要用域名訪問, 域名一定要有ssl證書,域名一定要有ssl證書,域名…

專家管理系統(源碼+文檔+講解+演示)

引言 在知識經濟時代,專家管理系統成為了企業優化知識資源、提升決策效率的重要工具。本文將介紹一款創新的專家管理系統,該系統通過智能化工具,助力企業實現專家資源的高效管理和利用。 平臺概述 專家管理系統采用前后端分離的架構設計&a…

css基礎-選擇器

選擇器進階 子串選擇器 /* 匹配 href 以 "https" 開頭的鏈接 */ a[href^"https"] {color: green; }/* 匹配 href 包含 "example" 的鏈接 */ a[href*"example"] {text-decoration: underline; }/* 匹配 href 以 ".pdf" 結尾…

Spring Boot屬性設置方法及優先級完整說明+表格對比

Spring Boot屬性設置方法及優先級完整說明 官網參考: https://docs.spring.io/spring-boot/3.4-SNAPSHOT/reference/features/external-config.html#features.external-config.files 屬性設置方法優先級順序(從高到低) 命令行參數&#xf…

上門家政小程序實戰,從0到1解決方案

一、邏輯分析 上門家政小程序主要涉及用戶端和服務端兩大部分。用戶端需要實現服務瀏覽、預約下單、訂單跟蹤等功能;服務端則要處理訂單管理、服務人員管理、數據統計等任務。以下是詳細的功能模塊分析: 用戶注冊與登錄:用戶通過手機號或第三…

LLVM學習-DragonEgg工具

2.2.2 使用DragonEgg和LLVM工具了解編譯流程 如果希望看到前端的運行情況,請使用-S -fplugin-arg-dragonegg-emit-ir標志,該標志將產生以LLVM IR代碼表示的人工可讀文件。 一旦編譯器將程序轉換為IR則停止編譯,并將內存中的表示內容寫入磁盤的…

關于cmd中出現無法識別某某指令的問題

今天來解決以下這個比較常見的問題,安裝各種軟件都可能會發生,一般是安裝時沒勾選注冊環境變量,導致cmd無法識別該指令。例如mysql,git等,一般初學者可能不太清楚。 解決這類問題最主要的是了解環境變量的概念&#x…

ThreadLocal詳解與高頻場景實戰指南

ThreadLocal詳解與高頻場景實戰指南 1. ThreadLocal概述 ThreadLocal是Java提供的線程本地變量機制,用于實現線程級別的數據隔離。每個訪問該變量的線程都會獲得獨立的變量副本,適用于需要避免線程間共享數據的場景。 特點: 線程封閉性&a…

【C++初階】---類和對象(上)

1.類的定義 1.1類的定義格式 ? class為定義類的關鍵字,Data為類的名字,{}中為類的主體,注意類定義結束時后?分號不能省略。類體中內容稱為類的成員:類中的變量稱為類的屬性或成員變量;類中的函數稱為類的?法或者成員函數。 ?…

Rust安裝并配置配置vscode編譯器

一. 下載rustup-init.exe rust下載網址:Getting started - Rust Programming Language 根據系統,選擇適合的exe文件 我選擇的的是右邊64bit的 打開下載的文件 輸入1,回車 二. Visual C 安裝 自動下載安裝vs 等待安裝完畢 三. Rust 安裝…

openGl片段著色器的含義

片段著色器的含義及代碼中的應用說明: 1. 片段著色器的基本概念 片段著色器(Fragment Shader)是OpenGL著色器管線中的關鍵組件,主要用于計算屏幕空間中每個片段(對應像素)的最終顏色。它是圖形渲染流程的…

事務的四大特性(ACID)詳解

事務的四大特性(ACID)詳解 在數據庫管理系統(如 MySQL)中,事務(Transaction) 是指一組要么全部執行、要么全部不執行的數據庫操作,通常用于確保數據的完整性和一致性。事務有四大核…

ubuntu設置開機自動運行應用

系統版本:Ubuntu 24.04.1 LTS桌面版 按招網上的資料顯示,當前版本主要的實現方式有以下兩種, 方式1:通過圖形界面的【啟動應用程序】設置開機自啟動;方式2:配置為服務實現開機自啟動。 但是在我的電腦上方…

ECharts各類炫酷圖表/3D柱形圖

一、前言 最近雞米花實現了各類的炫酷的圖表,有3D柱形圖、雙邊柱形圖以及異形柱形圖,好了,直接上圖: 二、效果圖 一個個來吧,下面就是代碼啦,注意,一下圖表展示的寬高均為800px*300px 三、異形橫…