【设计模式】装饰者模式里Java实现

插: AI时代,程序员或多或少要了解些人工智能,前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家(前言 – 人工智能教程 )

坚持不懈,越努力越幸运,大家一起学习鸭~~~

装饰者设计模式(Decorator Pattern)是一种结构型设计模式,允许你动态地将新行为添加到对象实例中。这种模式通过创建一个包装类,也就是装饰者,来包裹原始的类,并在不改变其接口的情况下,增加新的功能。在Java中,装饰者模式广泛应用于需要扩展对象功能或动态地为对象添加功能的场景。

装饰者模式的基本结构

在装饰者模式中,通常有四个角色:

  1. Component(组件接口):定义一个对象接口,可以动态地给这些对象添加职责。

  2. ConcreteComponent(具体组件):实现Component接口的具体对象,是被装饰的原始对象。

  3. Decorator(装饰者抽象类):实现Component接口,并持有一个Component对象引用。这个类可以为Component对象动态添加功能。

  4. ConcreteDecorator(具体装饰者):扩展Decorator类的功能,具体实现装饰功能。

示例:在Java中实现一个简单的装饰者模式

假设我们有一个基础的咖啡接口和具体的咖啡实现类,然后我们想要为这些咖啡添加额外的调料(装饰者),比如牛奶或者糖浆。

Step 1: 定义组件接口
// Component 接口
public interface Coffee {String getDescription();double getCost();
}
Step 2: 创建具体组件类
// ConcreteComponent 具体咖啡类
public class SimpleCoffee implements Coffee {@Overridepublic String getDescription() {return "Simple Coffee";}@Overridepublic double getCost() {return 1.0;}
}
Step 3: 定义装饰者抽象类
// Decorator 装饰者抽象类
public abstract class CoffeeDecorator implements Coffee {protected Coffee decoratedCoffee;public CoffeeDecorator(Coffee coffee) {this.decoratedCoffee = coffee;}public String getDescription() {return decoratedCoffee.getDescription();}public double getCost() {return decoratedCoffee.getCost();}
}
Step 4: 创建具体装饰者类
// ConcreteDecorator 具体装饰者类 - 牛奶
public class MilkDecorator extends CoffeeDecorator {public MilkDecorator(Coffee coffee) {super(coffee);}@Overridepublic String getDescription() {return super.getDescription() + ", with Milk";}@Overridepublic double getCost() {return super.getCost() + 0.5;}
}
Step 5: 使用装饰者模式
public class DecoratorPatternExample {public static void main(String[] args) {// 创建基础咖啡Coffee coffee = new SimpleCoffee();System.out.println("Cost: " + coffee.getCost() + "; Description: " + coffee.getDescription());// 加牛奶coffee = new MilkDecorator(coffee);System.out.println("Cost: " + coffee.getCost() + "; Description: " + coffee.getDescription());// 加糖浆coffee = new SyrupDecorator(coffee);System.out.println("Cost: " + coffee.getCost() + "; Description: " + coffee.getDescription());}
}

解释说明:

  • SimpleCoffee 实现了 Coffee 接口,表示基础的咖啡。

  • CoffeeDecorator 是装饰者的抽象类,持有一个 Coffee 对象的引用,通过组合的方式扩展 Coffee 的功能。

  • MilkDecorator 和 SyrupDecorator 分别是具体的装饰者类,通过继承 CoffeeDecorator 并重写相关方法,实现对咖啡的装饰。

通过这种方式,我们可以动态地为咖啡添加不同的调料,而不需要修改原始的咖啡类。这种设计模式提供了灵活性和可扩展性,使得我们可以在运行时动态地添加功能,而不会影响到其他对象。

装饰者模式在Java中的应用不仅局限于咖啡例子,还可以用于文件流处理、UI组件的动态功能添加等各种场景,是一种非常有用的设计模式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/40781.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【VIM的使用】

Vim 是一个非常强大的文本编辑器,尤其在 Linux 环境下被广泛使用。它基于 vi 编辑器开发而来,增加了许多功能和改进。下面是一个简化的 Vim 教程,帮助你快速上手: 启动 Vim 要启动 Vim,只需在终端中输入 vim [filen…

Leetcode刷题2---两数相加 Python

目录 题目及分析解法一: 迭代法解法二: 递归法解法三:反转链表法 题目及分析 (力扣序号2:两数相加) 给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储…

python之音频处理(2)两个音频文件的合并

from pydub import AudioSegment# 加载两个音频文件 audio1 AudioSegment.from_file(r"D:\websiteDownload\huanxing.wav") audio2 AudioSegment.from_file(r"D:\websiteDownload\我今天被一件事情搞得很烦.wav")# 设置间隔(单位:…

Altium Designer专业PCB设计软件下载安装 Altium Designer安装包下载获取

在电子设计的广袤领域中,PCB设计无疑占据着重要的地位。而Altium Designer作为一款业界领先的电子设计自动化软件,其提供的先进布局工具,无疑为设计师们打开了一扇通往高效、精确设计的大门。 在PCB设计的核心环节——布局中,Alti…

初学Spring之自动装配 Bean

Bean 的作用域: 1.单例模式(Spring 默认机制) scope“singleton” 2.原型模式:每次从容器中 get 时,都会产生一个新对象 scope"prototype" 3. request、session、application,只能在 web 开…

《c语言结构体怎么函数传参》

在C语言中,结构体(struct)是一种用户自定义的数据类型,用于组合多个不同类型的数据成员。当你要将结构体作为参数传递给函数时,可以按照以下几种方式进行: 值传递(Pass by Value)&a…

【pytorch扩展】CUDA自定义pytorch算子(简单demo入手)

Pytorch作为一款优秀的AI开发平台,提供了完备的自定义算子的规范。我们用torch开发时,经常会因为现有算子的不足限制我们idea的迸发。于是,CUDA/C自定义pytorch算子是不得不磕了。 今天通过一个小实验来梳理自定义pytorch算子都需要做哪些准…

软设之类的继承与泛化,多重继承

在类中,假如父类已经写好属性或方法,子类想要实现相同的功能,不用专门写代码,直接用专门的继承语言继承就可以了。 比如说有一个动物类,有毛色和叫这两个属性和方法,又写了一个子类是猫类,猫类…

腾讯云COS分布式对象存储

腾讯云COS分布式对象存储 腾讯云对象存储(Cloud Object Storage,COS)是腾讯云提供的一种用于存储海量文件的分布式存储服务。 腾讯云 COS 适用于多种场景,如静态网站托管、大规模数据备份和归档、多媒体存储和处理、移动应用数据存…

Kafka搭建(单机版)

部署前提 VMware环境 : 两台centos系统 Jdk包:jdk-8u202-linux-x64.tar.gz Kafka包:kafka_2.12-3.5.0.tgz Zookeeper包:apache-zookeeper-3.7.2-bin.tar.gz 百度网盘自取: 链接: https://pan.baidu.com/s/11EWuhBoSmH3musd_3Rgodw?pwde32t 提取码: e32t Kafka搭建(…

Camtasia 2024新功能 Camtasia2024更新介绍:AI剪辑助力微课制作 Camtasia2024密钥 Camtasia2023免费升级更新

Camtasia 是一款功能强大的屏幕录制和视频编辑软件,广泛应用于教育、商业和娱乐领域。无论是创建教学视频、产品演示、教程还是营销内容,Camtasia都能提供专业的工具和功能,帮助用户制作高质量的视频内容。 Camtasia 2024 中文免费安装包百度…

暑假学习DevEco Studio第2天

学习目标: 掌握页面跳转 学习内容: 跳转页面 创建页面: 在“project”窗口。打开“entry>src>main>ets”,右击“pages”,选择“New>ArkTS File”,命名“Second”,点击回车键。 在页面的路由&#xff0…

昇思25天学习打卡营第16天|文本解码原理——以MindNLP为例

在大模型中,文本解码通常是指在自然语言处理(NLP)任务中使用的大型神经网络模型(如Transformer架构的模型)将编码后的文本数据转换回可读的原始文本的过程。这些模型在处理自然语言时,首先将输入文本&#…

【Unix/Linux】Unix/Linux如何查看系统版本

Unix和Linux查看系统版本的指令有些区别,下面分别介绍: 一.Unix查看系统版本 在Unix系统中,查看系统版本的方法可能会根据具体的Unix操作系统而有所不同。以下是一些通用的方法,适用于多种Unix系统,包括但不限于Solaris、AIX、H…

vienna整流器过零畸变原因分析

Vienna整流器是一种常见的三电平功率因数校正(PFC)整流器,广泛应用于电源和电能质量控制领域。由于其高效率、高功率密度和低谐波失真的特点,Vienna整流器在工业和电力电子应用中具有重要地位。然而,在实际应用中&…

ssh:(xshell)远程连接失败

项目场景: 提示:这里简述项目相关背景: 云服务器远程连接失败 xshell 远程连接失败 xshell (ssh客户端) ---------------------------------------------安全组----------防火墙-------黑白名单-----SSH服务 问题排查 1. 安全…

Playwright之录制脚本转Page Object类

Playwright之录制脚本转Page Object类 设计思路 : 我们今天UI自动化设计的时候,通常会遵循一些设计模式,例如Page Object模式。但是自己找元素再去填写有一些麻烦,所以我们可以通过拆解录制的脚本,将其中的元素提取出来…

DALL-E、Stable Diffusion 等 20+ 图像生成模型综述

二、任务场景 2.1. 无条件生成 无条件生成是指生成模型在生成图像时不受任何额外条件或约束的影响。模型从学习的数据分布中生成图像,而不需要关注输入条件。 2.2. 有条件生成 有条件生成是指生成模型在生成图像时受到额外条件或上下文的影响。这些条件可以是类别…

Vscode 保存代码,代码自动格式化

我这里使用的插件是Prettier-Code formatter:自动缩进整理代码的格式,使用方法如下: 先在vscode商店找到插件并安装:安装插件之后,随便找到一个项目文件,右键选择格式化文档:选中我们安装的插件…

掌握Vim的会话之道:深度解析会话管理功能

掌握Vim的会话之道:深度解析会话管理功能 在高效的文本编辑工作流中,能够保存和恢复编辑会话是极其重要的。Vim,作为一个功能强大的文本编辑器,提供了会话管理功能,允许用户保存当前的工作状态,并在之后重…