Java觀察者模式:實現高效的事件驅動編程

Java中的裝飾者模式:靈活地為對象添加功能

一、引言

在軟件設計中,我們經常需要為對象動態地添加功能或行為。裝飾者模式(Decorator Pattern)是一種結構型設計模式,它允許我們在運行時將功能動態地添加到對象上,而無需修改其原始類或使用繼承。Java IO流中的許多類就使用了裝飾者模式,以便我們可以靈活地組合各種輸入/輸出功能。

二、裝飾者模式的定義與結構

裝飾者模式是一種動態地給一個對象添加一些額外的職責,就增加功能來說,裝飾器模式相比生成子類更為靈活。裝飾者模式的核心在于裝飾者(Decorator)類,它實現了與原始類(Component)相同的接口,并持有一個原始類的實例。裝飾者可以在需要時調用原始對象的方法,并在其前后添加新的功能。

裝飾者模式的主要角色如下:

  1. 抽象組件(Component):定義一個接口或抽象類,為原始對象和裝飾者對象提供統一的接口。
  2. 具體組件(ConcreteComponent):實現抽象組件接口的具體類,是裝飾者模式中的原始對象。
  3. 裝飾者(Decorator):實現了抽象組件接口的類,持有一個抽象組件的引用,可以在調用原始對象的方法前后添加新的功能。
  4. 具體裝飾者(ConcreteDecorator):裝飾者的具體實現類,為原始對象添加具體的功能。

三、Java中的裝飾者模式實現

下面是一個簡單的Java代碼示例,演示了如何使用裝飾者模式為一個“飲料”對象動態地添加功能:

// 抽象組件
interface Beverage {double cost();String getDescription();
}// 具體組件
class Coffee implements Beverage {@Overridepublic double cost() {return 1.99;}@Overridepublic String getDescription() {return "Coffee";}
}// 裝飾者
abstract class BeverageDecorator implements Beverage {protected Beverage beverage;public BeverageDecorator(Beverage beverage) {this.beverage = beverage;}@Overridepublic double cost() {return beverage.cost();}@Overridepublic String getDescription() {return beverage.getDescription();}
}// 具體裝飾者
class Milk extends BeverageDecorator {public Milk(Beverage beverage) {super(beverage);}@Overridepublic double cost() {return beverage.cost() + 0.30;}@Overridepublic String getDescription() {return beverage.getDescription() + ", Milk";}
}class Sugar extends BeverageDecorator {public Sugar(Beverage beverage) {super(beverage);}@Overridepublic double cost() {return beverage.cost() + 0.20;}@Overridepublic String getDescription() {return beverage.getDescription() + ", Sugar";}
}// 客戶端代碼
public class DecoratorPatternDemo {public static void main(String[] args) {Beverage beverage = new Coffee();System.out.println(beverage.getDescription() + " $" + beverage.cost());beverage = new Milk(beverage);System.out.println(beverage.getDescription() + " $" + beverage.cost());beverage = new Sugar(beverage);System.out.println(beverage.getDescription() + " $" + beverage.cost());}
}

在上面的代碼中,我們創建了一個名為Beverage的接口,它定義了兩個方法:cost()和getDescription()。Coffee類實現了這個接口,表示一種具體的飲料。BeverageDecorator是一個抽象裝飾者類,它實現了Beverage接口并持有一個Beverage對象的引用。Milk和Sugar類是兩個具體裝飾者類,它們分別表示添加牛奶和糖的功能。在客戶端代碼中,我們可以動態地為Coffee對象添加Milk和Sugar裝飾者,從而改變其行為和屬性。

四、總結

裝飾者模式是一種強大的設計模式,它允許我們在運行時動態地為對象添加功能,而無需修改原始類或使用繼承。通過組合多個裝飾者,我們可以創建出具有各種功能和屬性的對象。在Java中,裝飾者模式廣泛應用于IO流、集合框架等領域,為這些類庫提供了極大的靈活性和可擴展性。

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

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

相關文章

串的相關題目

于是他錯誤的點名開始了 我發現有關hash得題目有些是可以通過map數組來完成的:何為map數組,我們先思考一下最簡單的桶的排序,桶排序是將我們需要數字最為下標輸進數組中,而數組是存放的數字是這個數字出現的次數,但是由…

Matlab論文插圖繪制模板第137期—極坐標分組氣泡圖

在之前的文章中,分享了Matlab極坐標氣泡圖的繪制模板: 進一步,再來分享一下極坐標分組氣泡圖。 先來看一下成品效果: ? 特別提示:本期內容『數據代碼』已上傳資源群中,加群的朋友請自行下載。有需要的朋…

解決SSH遠程登錄開飯板出現密碼錯誤問題

輸入“adduser Zhanggong回車”,使用adduser命令創建開發板用戶名為Zhanggong 輸入密碼“123456” 輸入密碼“123456”

openGauss學習筆記-226 openGauss性能調優-系統調優-配置LLVM-LLVM適用場景與限制

文章目錄 openGauss學習筆記-226 openGauss性能調優-系統調優-配置LLVM-LLVM適用場景與限制226.1 適用場景226.2 非適用場景 openGauss學習筆記-226 openGauss性能調優-系統調優-配置LLVM-LLVM適用場景與限制 226.1 適用場景 支持LLVM的表達式 查詢語句中存在以下的表達式支持…

PostgreSQL數據庫備份和恢復

一、數據庫備份 /usr/lib/postgresql/16/bin/pg_dump -h localhost -p 5432 -U odoo -F c -b -v -f backup.sql laonian 二、數據庫恢復 1 現在目標pgsql數據庫中創建空數據庫老年 create database laonian owner odoo; 2 執行恢復命令(windows系統下&#xff…

網絡安全-nc(Netcat)工具詳解

經常在反彈shell的時候使用nc命令,但是從來沒有了解過,今天翻書看到了,準備記錄一下。 nc全稱Netcat,是TCP/IP連接的瑞士軍刀。哈哈我最喜歡瑞士軍刀了。 有一個比較偏的知識點,nc還可以探測目標的端口是否開放&…

Modern C++ std::variant的5個特性+原理

1 前言 上一節《Modern C std::variant的實現原理》我們簡單分析了std::variant的實現原理,其實要學好C編程,除了看優秀的代碼包括標準庫實現,讀文檔也是很便捷且必須的一種辦法。 本節我將逐條解析文檔中的五個特性,解析的辦法有…

LINUX操作系統:重定向

輸出重定向:將命令行程序的輸出重定向到其他位置,如文件、程序、打印機等。 輸入重定向:從其他位置獲取輸入,而不是從標準輸入(鍵盤、鼠標等) 錯誤重定向:同輸出。 輸出重定向(Outp…

R語言【sp】——over(),%over%

Package sp version 1.5-0 Description 點、網格和多邊形的一致空間覆蓋:在對象x的空間位置從空間對象y檢索索引或屬性。 Usage over(x, y, returnList = FALSE, fn = NULL, ...) x %over% y Arguments 參數【x】:查詢的幾何(位置)。 參數【y】:層,從中查詢幾何或屬性。…

PYTHON-使用正則表達式進行模式匹配

目錄 Python 正則表達式Finding Patterns of Text Without Regular ExpressionsFinding Patterns of Text with Regular ExpressionsCreating Regex ObjectsMatching Regex ObjectsReview of Regular Expression MatchingMore Pattern Matching with Regular ExpressionsGroupi…

阿里開源低代碼引擎 - Low-Code Engine

阿里開源低代碼引擎 - Low-Code Engine 本文主要介紹如何在Windows運行/開發阿里開源低代碼引擎 - Low-Code Engine 詳細文檔參見【 阿里開源低代碼引擎 - Low-Code Engine 官方文檔】 目錄 阿里開源低代碼引擎 - Low-Code Engine一、環境準備1、使用 WSL 在 Windows 上安裝 L…

方法鑒權:基于 Spring Aop 的注解鑒權

在Spring框架中,可以使用面向切面編程(AOP)來實現注解鑒權。這通常涉及到定義一個切面(Aspect),該切面會在方法執行前進行攔截,并根據注解value值來決定是否允許執行該方法。 簡單思路&#xf…

Java學習筆記2024/2/22

面向對象進階部分學習方法: 特點: 邏輯性沒有那么強,但是概念會比較多。 記憶部分重要的概念,理解課堂上講解的需要大家掌握的概念,多多練習代碼。 今日內容 復習回顧 static關鍵字 繼承 教學目標 能夠掌握st…

【開源】JAVA+Vue.js實現醫院門診預約掛號系統

目錄 一、摘要1.1 項目介紹1.2 項目錄屏 二、功能模塊2.1 功能性需求2.1.1 數據中心模塊2.1.2 科室醫生檔案模塊2.1.3 預約掛號模塊2.1.4 醫院時政模塊 2.2 可行性分析2.2.1 可靠性2.2.2 易用性2.2.3 維護性 三、數據庫設計3.1 用戶表3.2 科室檔案表3.3 醫生檔案表3.4 醫生放號…

qml 保存當前界面并在其圖片中添加文字

使用場景:在保存二維碼的時候, 在二維碼圖片加標題或描述 保存后的圖片 demo:https://download.csdn.net/download/uVarAndMethod/88868455

Electron實戰之環境搭建

工欲善其事必先利其器,在進行實戰開發的時候,我們最終的步驟是搞好一個舒服的開發環境,目前支持 Vue 的 Electron 工程化工具主要有 electron-vue、Vue CLI Plugin Electron Builder、electron-vite。 接下來我們將分別介紹基于 Vue CLI Plu…

一、計算機的語言奇跡:探秘ChatGPT的智能回答和寫作能力—我耀學IT

目前我們這個行業,最火的話題無疑是AI人工智能,類似ChatGPT這樣的智能Ai,今天剩下的時間不多,每天一個主題,我給大家講一下計算機回答問題和寫作的能力,尤其是聊天型AI模型ChatGPT。讓大家可以更加前沿的了解一下關于它…

暴雨信息|警惕AI 的變革陣痛與不穩定性

過去的未來主義幽靈使我們對數字化變革的預測保持謹慎。 我們現在經常聽到,世界正處于一個技術轉折點;我們正在快速步入一個由 ChatGPT 等人工智能工具塑造的未來。然而,我懷疑,2024 年我們將會被提醒到納普斯特的幽靈——以及其他…

ChatGPT在數據分析崗位了解階段的應用

ChatGPT在數據分析崗位了解階段的應用 ? 1.1 數據分析師的職責與技能要求 ? 如果想成為數據分析師,首先要了解這個崗位的具體職責和技能要求。這個問題可以直接詢問ChatGPT: ? ChatGPT收到上述內容后,返回如下結果。 ? ChatGPT給出的信…

LeetCode56.合并區間

題目 以數組 intervals 表示若干個區間的集合,其中單個區間為 intervals[i] [starti, endi] 。請你合并所有重疊的區間,并返回 一個不重疊的區間數組,該數組需恰好覆蓋輸入中的所有區間 。 示例 輸入:intervals [[1,3],[2,6]…