設計模式-裝飾者模式應用實踐

裝飾者模式(Decorator Pattern)是一種結構型設計模式,它允許動態地向一個現有的對象添加新的功能,同時不改變其結構。這種模式通過創建一個裝飾類來包裝原有的類,提供額外的行為。

下面是一個使用 Java 實現裝飾者模式的實踐案例:

場景描述

假設我們正在開發一個咖啡館應用程序,需要能夠計算訂單中各種類型咖啡的成本。基本咖啡可以添加多種調料(如摩卡、奶泡、豆漿等),每種調料都會增加咖啡的成本。

步驟1:定義組件接口

1// 咖啡接口,作為所有咖啡和調料的基類
2public interface Coffee {
3    String getDescription();
4    double getCost();
5}

步驟2:實現具體組件

1// 簡單咖啡類,實現咖啡接口
2public class SimpleCoffee implements Coffee {
3    @Override
4    public String getDescription() {
5        return "Simple Coffee";
6    }
7
8    @Override
9    public double getCost() {
10        return 10; // 基礎價格
11    }
12}

步驟3:創建裝飾者抽象類

1// 咖啡裝飾者抽象類,實現咖啡接口并持有一個咖啡接口的引用
2public abstract class CoffeeDecorator implements Coffee {
3    protected Coffee decoratedCoffee;
4
5    public CoffeeDecorator(Coffee coffee) {
6        this.decoratedCoffee = coffee;
7    }
8
9    @Override
10    public String getDescription() {
11        return decoratedCoffee.getDescription();
12    }
13
14    @Override
15    public double getCost() {
16        return decoratedCoffee.getCost();
17    }
18}

步驟4:實現具體裝飾者

1// 摩卡裝飾者,添加摩卡調料的功能
2public class MochaDecorator extends CoffeeDecorator {
3    public MochaDecorator(Coffee coffee) {
4        super(coffee);
5    }
6
7    @Override
8    public String getDescription() {
9        return decoratedCoffee.getDescription() + ", Mocha";
10    }
11
12    @Override
13    public double getCost() {
14        return decoratedCoffee.getCost() + 2; // 添加摩卡調料的成本
15    }
16}
17
18// 奶泡裝飾者,添加奶泡調料的功能
19public class WhipDecorator extends CoffeeDecorator {
20    public WhipDecorator(Coffee coffee) {
21        super(coffee);
22    }
23
24    @Override
25    public String getDescription() {
26        return decoratedCoffee.getDescription() + ", Whip";
27    }
28
29    @Override
30    public double getCost() {
31        return decoratedCoffee.getCost() + 1; // 添加奶泡調料的成本
32    }
33}
34
35// 其他裝飾者類似...

步驟5:客戶端代碼使用裝飾者

1public class DecoratorPatternDemo {
2    public static void main(String[] args) {
3        Coffee coffee = new SimpleCoffee();
4        System.out.println(coffee.getDescription() + " Cost: $" + coffee.getCost());
5
6        coffee = new MochaDecorator(coffee);
7        System.out.println(coffee.getDescription() + " Cost: $" + coffee.getCost());
8
9        coffee = new WhipDecorator(coffee);
10        System.out.println(coffee.getDescription() + " Cost: $" + coffee.getCost());
11
12        // 可以繼續添加更多裝飾者
13        // coffee = new SoyDecorator(coffee);
14        // System.out.println(coffee.getDescription() + " Cost: $" + coffee.getCost());
15    }
16}

在此實踐案例中,CoffeeDecorator 類提供了一個包裝咖啡對象的功能。具體的裝飾者類(如 MochaDecorator 和 WhipDecorator)添加了額外的行為和成本。通過這種方式,我們可以組合不同的裝飾者來創建多種咖啡變體,而無需為每一種組合創建一個新類。

裝飾者模式是一種靈活的替代方案,相比生成子類更為優雅。這種模式非常適合用于擴展類的功能,特別是當我們希望在運行時能夠動態地添加或刪除功能時。此模式也遵循開閉原則,因為我們可以添加新的裝飾者類而不修改現有代碼。

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

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

相關文章

【Spring Boot】實現全局異常處理

1.定義基礎異常接口類 /*** description: 服務接口類* author: MrVK* date: 2021/4/19 21:39*/ public interface BaseErrorInfoInterface {/*** 錯誤碼* return*/String getResultCode();/*** 錯誤描述* return*/String getResultMsg(); } 2.定義錯誤處理枚舉類 /*** desc…

小伙伴詢問AI該怎么學習?本人的一點總結,以思維導圖呈現

如有需要思維導圖的在后臺請留郵箱,相關知識結構目錄 部分導圖

nn.Linear() 使用提醒

原本以為它是和nn.Conv2d()一樣,就看第二個維度的數值,今天才知道,它是只看最后一個維度的數值!!! 例子1 Descripttion: Result: Author: Philo Date: 2024-02-27 14:33:50 LastEditors: Philo LastEditT…

git使用merge命令把dev分支的mian.js文件和src下面的vuex文件夾以及config文件夾單獨合并到master分支上

使用 git merge 命令來單獨合并特定文件或文件夾到另一個分支通常不是最直接的方法,因為 merge 命令是用來合并兩個分支的所有更改的。然而,你可以通過 git cherry-pick 命令或者通過創建臨時補丁(patch)來實現這一點。 下面是一個…

秒殺的時候怎么使用Redis?

商品信息存儲:在Redis中存儲秒殺商品的庫存信息。可以使用Redis的Hash數據類型,將商品ID作為字段,庫存數量作為值存儲在Hash中。例如,HSET seckill_goods stock_1 100表示商品ID為stock_1的商品庫存數量為100。 秒殺訂單存儲&…

如何使用“Ubuntu 20.04桌面版,安裝MariaDB數據庫“?win10系統?

1、更新軟件包 sudo apt update 2、 安裝MariaDB服務器和客戶端 sudo apt install mariadb-server mariadb-client 3、 查看MeriaDB是否運行 service mysql status :q"退回命令行狀態 4、 設置MariaDB root用戶的密碼 sudo mysql_secure_installation 5、 MariaD…

斐波那契數列模型----三步問題

面試題 08.01. 三步問題 - 力扣(LeetCode) 1、狀態表示: 題目要求:上到n階臺階,有多少種方法。那么n逐漸簡化,上1階臺階有多少種方法;上2階臺階有多少種方法……直到上n階臺階有多少種方法。 …

c++ [[nodiscard]]關鍵字詳解

如果一個函數聲明了[[nodiscard]],則該函數的返回值不能沒有承接,如果沒有承接,就會編譯報warning [[nodiscard]]是c17新特性,但本地用c11標準編譯也能編譯過,尚不清楚原因,c20加入了warning后的額外文字描…

代碼隨想錄第45天|● 70. 爬樓梯 (進階) ● 322. 零錢兌換 ● 279.完全平方數

文章目錄 ● 70. 爬樓梯 (進階)思路:- 排列 先value后weight代碼: ● 322. 零錢兌換思路:代碼 ● 279.完全平方數思路:代碼 ● 70. 爬樓梯 (進階) 思路:- 排列 先value后…

如何提升計算機性能

04 穿越功耗墻,我們該從哪些方面提升“性能”? 上一講,在講 CPU 的性能時,我們提到了這樣一個公式: 程序的 CPU 執行時間 指令數CPIClock Cycle Time 這么來看,如果要提升計算機的性能,我們可以…

zookeeper框架

事務ID Znode的創建刪除,更改內容等都是作為zookeeper的事務進行執行的。 對于每一個事務請求,zookeeper都會為其分配一個全局唯一的事務ID,從ID可以識別出事務的全局順序。 節點特性 czxid:create zxid,數據節點創建時的事務ID mzxid&…

基于ZYNQ的PCIE高速數據采集卡的設計(一)

作為信息處理的第一步,數據采集的作用越來越重要。目前,數據采集已經在航 空、民用、軍事、醫療等領域得到廣泛應用。隨著相關技術的不斷發展,信號頻率越 來高,帶寬越來越大,使得數據采集技術逐漸向高速大數據的方向…

【python】優化docker鏡像體積

背景 測試腳本的最終所構成的鏡像體積偏大,項目提出整改 實現思路 1.測試基礎鏡像,更換為更小的 參見:python 多階段構建docker鏡像,有效減少鏡像大小 - 知乎 2.去掉實際未使用的依賴庫

幻獸帕魯專用服務器搭建之Linux部署配置教程

大家好我是飛飛,上一期我分享了Windows系統的幻獸帕魯服務器搭建教程。因為幻獸帕魯這游戲對服務器的配置有一定的要求,很多小伙伴就尋思用Linux系統搭建占用會不會小一點?有計算機基礎的小伙伴都知道Linux系統和Windows系統相比,…

【Linux】實時查看服務器信息

查看服務器CPU使用率 使用命令mpstat 1。這里的1表示每隔1秒更新一次CPU使用率。如果系統未安裝mpstat,可以通過安裝sysstat包來獲取它。 在基于Debian的系統(如Ubuntu)上,使用命令: sudo apt-get update sudo apt-…

JavaScript 數據類型詳解的教程

在JavaScript中,數據類型是非常重要的概念,了解數據類型有助于我們更好地操作數據以及編寫高效的代碼。本教程將詳細介紹JavaScript中的各種數據類型,包括基本數據類型和復雜數據類型。 基本數據類型 1. 數值(Number) 在JavaScript中&…

考研復試類比社團招新,無所謂“公平”,導師選誰都是他的權力

這篇文章是抖音和b站上上傳的同名視頻的原文稿件,感興趣的csdn用戶可以關注我的抖音和b站賬號(GeekPower極客力量)。同時這篇文章也為視頻觀眾提供方便,可以更加冷靜地分析和思考。文章同時在知乎發表。 我考研一戰的時候計算機考…

MySQL 主從復制配置指南

MySQL 主從復制配置指南 MySQL主從復制允許數據從一個MySQL數據庫服務器(主服務器)復制到一個或多個MySQL數據庫服務器(從服務器)。這是一種常用的數據冗余和備份方法,也可以用于負載均衡。 前提條件 主服務器和從服…

【詳識JAVA語言】面向對象程序三大特性之一:封裝

封裝的概念 面向對象程序三大特性:封裝、繼承、多態。而類和對象階段,主要研究的就是封裝特性。何為封裝呢?簡單來說 就是套殼屏蔽細節。 比如:對于電腦這樣一個復雜的設備,提供給用戶的就只是:開關機、通…

飛槳模型轉ONNX模型教程

文章目錄 飛槳模型轉ONNX模型教程1. ONNX簡介2. Paddle2ONNX安裝3. 獲取Paddle2ONNX模型庫4. 飛槳轉ONNX教程4.1 飛槳訓練模型導出為ONNX模型4.2 飛槳部署模型轉為ONNX模型4.3 驗證ONNX模型4.4 使用ONNX模型進行推理 5. 注意事項 飛槳模型轉ONNX模型教程 1. ONNX簡介 ONNX是一…