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.mzph.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]…