裝飾模式Decorator Pattern

模式定義

動態地給對象增加額外的職責

  • 對象結構型模式

模式結構

  • Component:抽象構件
  • ConcreteComponent: 具體構件
  • Decorator:抽象裝飾類
  • ConcreteDecorator: 具體裝飾類
抽象裝飾類代碼
public class Decorator extends Component {private Component component;public Decorator(Component component) {this.component = component;}public void operation() {component.operation();}}

具體裝飾類代碼

public class ConcreteDecorator extends Decorator {Object addedState; // 新增屬性public ConcreteDecorator(Component component) {super(component);}public void operation() {super.operation();addedBehavior();}// 新增方法public void addedBehavior() {// do something}}
  • 一個裝飾類的接口必須與被裝飾類的接口保持相同
    • 對于客戶端來說無論是裝飾之前的對象還是裝飾之后的對象都可以一致對待
  • 盡量保持具體構件類Component作為一個“輕”類
    • 不要把太多的邏輯和狀態放在具體構件類中可以通過裝飾類對其進行擴展

簡化裝飾模式

如果只有一個具體構件類而沒有抽象構件類,那么抽象裝飾類可以作為具體構件類的直接子類

透明裝飾模式

客戶端完全面向抽象編程

  • 客戶端不聲明具體構件類型和具體裝飾類型,而全部聲明為抽象構件類型

半透明裝飾模式

客戶端面向抽象構件類型具體裝飾類型編程

  • 客戶端可以聲明具體裝飾者類型對象,調用具體裝飾者中新增方法

實例

某系統提供了一個數據加密功能,可以對字符串進行加密。最簡單的加密算法通過對字母進行移位來實現,同時還提供了稍復雜的逆向輸出加密,還提供了更為高級的求模加密。用戶先使用最簡單的加密算法對字符串進行加密,如果覺得還不夠可以對加密之后的結果使用其他加密算法進行二次加密,當然也可以進行第三次加密。現使用裝飾模式設計該多重加密系統。

模式分析

  • 優點
    • 提供比繼承更多的靈活性以擴展對象功能
    • 通過配置文件在運行時選擇不同的裝飾器以動態擴展對象功能
    • 具體構件類和具體裝飾類可以獨立變化
      • 符合開閉原則
  • 缺點
    • 增加系統的復雜度
    • 比繼承更加易于出錯,排錯困難

適用環境

  • 在不影響其他對象的情況下,以動態、透明的方式給單個對象添加職責
  • 需要動態地給一個對象增加功能,這些功能也可以動態地被撤銷
  • 當不能采用繼承的方式對系統進行擴充或者采用繼承不利于系統擴展和維護時
    • 系統中存在大量獨立的擴展,為支持每一種組合將產生大量的子類,使得子類數目呈爆炸性增長
    • 不能繼承的類定義(如final類)

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

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

相關文章

https說明

http是無狀態的,https是在http應用層協議和tcp傳輸控制層之間加了一層,主要功能包括加密傳輸內容,校驗信息是否完整,信息是否被篡改等。http的網絡傳輸,源端應用層發送http請求,傳輸到源端的控制層&#xf…

實時操作系統(FreeRTOS、RT-Thread)RISC-V

FreeRTOS:FreeRTOS? - FreeRTOS? RT-Thread:rt-thread.org VxWorks: QNX Neutrino RTOS: RT-Linux: 一、 實時操作系統介紹 實時操作系統(Real Time Operating System,簡稱RTOS&#xff…

Python3除標準庫外更全面的XML解析方案

一、擴展解析庫方案 lxml高性能解析 from lxml import etree doc etree.parse(data.xml) # XPath 2.0增強查詢 nodes doc.xpath(//student[score>90]/name/text())優勢:支持XPath 2.0語法和XSLT轉換,比標準庫快5-10倍 BeautifulSoup混合解析 fr…

同時裝兩個MySQL, 我在MySQL5的基礎上, 安裝MySQL8

目錄 1. 前言 2. 下載MySQL 3. 安裝MySQL 3.1 第一步:選擇MySQL ?編輯 3.2 第二步:存儲地址 3.3 第三步 3.4 第四步:完成基礎配置 3.5 第五步 3.6 第六步:數據庫密碼 3.7 第七部:服務名 4. 環境變量 4.1 復制MySQL的bin地址 4.2 進入高級系統設置 4.3 PATH 4.4 更改…

Visual Studio 2022打包程序流程

Visual Studio 2022打包程序流程 打開管理拓展 安裝Microsoft Visual Studio Installer Projects 關閉軟件才能繼續安裝 安裝完成后點擊,解決方案,創建新項目 添加:setup project 打開軟件的路徑 復制路徑 添加文件 粘貼剛才復制的路徑&…

web3方法詳解

web3.py 是一個功能強大的 Python 庫,用于與以太坊區塊鏈交互。它提供了多種模塊和功能,涵蓋賬戶管理、智能合約交互、交易發送、區塊鏈數據查詢等。以下是 web3.py 的主要功能模塊及其用途: 1. Web3 核心模塊 功能:提供基礎連接、工具函數和核心功能。 常用方法: Web3(…

HTML5+JS實現一個簡單的SVG 貝塞爾曲線可視化設計器,通過幾個點移動位置,控制曲線的方向

三次貝塞爾曲線,二次貝塞爾曲線有什么區別 https://blog.csdn.net/xiaoyao961/article/details/148678265 SVG 貝塞爾曲線可視化設計器 下面是一個簡單的貝塞爾曲線可視化設計器,使用 HTML5 和 JavaScript 實現。這個設計器允許你通過拖動控制點來實時調整貝塞爾曲…

Pytorch框架——自動微分和反向傳播

一、自動微分概念 自動微分(Automatic Differentiation,AD)是一種利用計算機程序自動計算函數導數的技術,它是機器學習和優化算法中的核心工具(如神經網絡的梯度下降),通過反向傳播計算并更新梯…

【Linux手冊】進程的狀態:從創建到消亡的“生命百態”

目錄 前言 操作系統進程狀態 運行狀態 阻塞狀態 掛起狀態 Linux中具體的進程狀態 R(running)運行狀態 S(sleeping)阻塞狀態 D(disk sleep)磁盤休眠狀態 T(stopped)和t(tracing stop) X(dead)終止狀態 Z(zombie)僵尸狀態 僵尸進程的危害 前言 我們在運行可執行程序…

李沐--動手學深度學習 LSTM

1.從零開始實現LSTM #從零開始實現長短期記憶網絡 import torch from torch import nn from d2l import torch as d2l#加載時光機器數據集 batch_size,num_steps 32,35 train_iter,vocab d2l.load_data_time_machine(batch_size,num_steps)#1.定義和初始化模型參數&#xff…

面經的疑難雜癥

1.介紹一下虛擬地址,虛擬地址是怎么映射到物理地址的? 虛擬地址是指在采用虛擬存儲管理的操作系統中,進程訪問內存時所使用的地址。每個進程都有獨立的虛擬地址空間,虛擬地址通過操作系統和硬件(如MMU,內存…

去噪擴散概率模型(DDPM)全解:從數學基礎到實現細節

一、 概述 在這篇博客文章中,我們將深入探討去噪擴散概率模型(也被稱為 DDPMs,擴散模型,基于得分的生成模型,或簡稱為自動編碼器),這可以說是AIGC最近幾年飛速發展的基石,如果你想做…

【系統分析師】2011年真題:案例分析-答案及詳解

文章目錄 試題1【問題 1】【問題 2】【問題 3】 試題2【問題 1】【問題 2】【問題 3】 試題3【問題 1】【問題 2】【問題 3】 試題4【問題 1】【問題 2】【問題 3】 試題5【問題 1】【問題 2】【問題 3】 試題1 隨著寬帶應用快速發展,用戶要求系統服務提供商提供基…

【unitrix】 1.7 規范化常量類型結構(standardization.rs)

一、源碼 這段代碼實現了一個二進制數字標準化系統,用于將二進制數字類型(B0/B1)轉換為更簡潔的表示形式。 //! 二進制數字標準化模塊 / Binary Number Normalization Module //! //! 提供將二進制數字(B0/B1)標準化為更簡潔表示形式的功能…

NJet Portal 應用門戶管理介紹

nginx向云原生演進,All in OpenNJet! 1. 應用門戶簡介 NJet 應用引擎是基于 Nginx 的面向互聯網和云原生應用提供的運行時組態服務程序,作為底層引擎,NJet 實現了NGINX 云原生功能增強、安全加固和代碼重構,利用動態加…

uni-app學習筆記三十六--分段式選項卡組件的使用

先來看效果: 上圖有3個選項卡(PS:uniapp官方稱之為分段器,我還是習慣叫選項卡),需要實現點擊不同的選項卡時下方切換顯示對應的數據。 下面介紹下實現的過程。 1.在uniapp官方文檔下載并安裝該擴展組件:u…

Qt:Qt桌面程序正常退出注意事項

一般情況下,Qt窗體的創建和顯示命令如下: Main_window main_window; main_window.show(); 主窗體中設置屬性Qt::WA_DeleteOnClose setAttribute(Qt::WA_DeleteOnClose); 則在main.cpp中可以將窗體創建為指針,這樣在退出時可以正確釋放指針…

【arXiv2024】時間序列|TimesFM-ICF:即插即用!時間序列預測新王者!吊打微調!

論文地址:https://arxiv.org/pdf/2410.24087 代碼地址:https://github.com/uctb/TSFM 為了更好地理解時間序列模型的理論與實現,推薦參考UP “ThePPP時間序列” 的教學視頻。該系列內容系統介紹了時間序列相關知識,并提供配套的論…

從0開始學習語言模型--Day02-如何最大化利用硬件

如何利用硬件 這個單元分為內核、并行處理和推理。 內核(Kernels) 我們說的內核一般指的就是GPU,這是我們用于計算的地方,一般說的計算資源就指的是GPU的大小。我們模型所用的數據和參數一般存儲在內存里,假設把內存…

ElasticSearch配置詳解:設置內存鎖定的好處

什么是內存鎖定 "bootstrap": {"memory_lock": "true" }內存鎖定是指將Elasticsearch的JVM堆內存鎖定在物理內存中,防止操作系統將其交換(swap)到磁盤。 內存交換是操作系統的虛擬內存管理機制,當…