当前位置: 首页 > news >正文

Java—装饰器模式

介绍

装饰器模式

装饰器模式(Decorator Pattern)是一种结构型设计模式,它允许你动态地将行为添加到现有的对象中,而无需修改其代码。装饰器模式提供了比继承更灵活的功能扩展方式。

主要角色
  1. Component:定义一个对象接口,可以给这些对象动态地添加职责。
  2. ConcreteComponent:具体实现Component接口的类,即被装饰器装饰的原始对象。
  3. Decorator:装饰器基类,持有一个Component对象的引用,并且与Component接口保持一致。
  4. ConcreteDecorator:具体的装饰器类,实现具体要向Component添加的功能。

Java代码实现示例

我们将通过一个简单的例子来演示装饰器模式。假设我们有一个基本的消息发送系统,能够发送简单的文本消息。现在我们希望能够在发送消息之前对消息进行加密,并在发送之后记录日志。

定义组件接口和具体组件
// Component
interface Message {String send();
}// ConcreteComponent 被装饰者
class TextMessage implements Message {private String content;public TextMessage(String content) {this.content = content;}@Overridepublic String send() {return "Sending message: " + content;}
}
定义装饰器基类和具体装饰器
// Decorator 装饰者 (增强)
abstract class MessageDecorator implements Message {protected Message wrapped;public MessageDecorator(Message wrapped) {this.wrapped = wrapped;}@Overridepublic String send() {return wrapped.send();}
}// ConcreteDecoratorA
class EncryptedMessageDecorator extends MessageDecorator {public EncryptedMessageDecorator(Message wrapped) {super(wrapped);}@Overridepublic String send() {String originalMessage = wrapped.send();String encryptedMessage = encrypt(originalMessage);return "Encrypted(" + encryptedMessage + ")";}private String encrypt(String message) {// 简单的模拟加密逻辑StringBuilder encrypted = new StringBuilder(message);return encrypted.reverse().toString();}
}// ConcreteDecoratorB
class LoggedMessageDecorator extends MessageDecorator {public LoggedMessageDecorator(Message wrapped) {super(wrapped);}@Overridepublic String send() {String result = wrapped.send();log(result);return result;}private void log(String message) {System.out.println("Logging: " + message);}
}
使用装饰器模式
public class Main {public static void main(String[] args) {Message message = new TextMessage("Hello, World!");// 使用加密装饰器Message encryptedMessage = new EncryptedMessageDecorator(message);System.out.println(encryptedMessage.send());  // 输出加密后的消息// 使用日志装饰器Message loggedMessage = new LoggedMessageDecorator(message);System.out.println(loggedMessage.send());  // 日志消息并输出// 组合装饰器Message encryptedLoggedMessage = new LoggedMessageDecorator(new EncryptedMessageDecorator(message));System.out.println(encryptedLoggedMessage.send());  // 输出加密并记录日志的消息}
}

运行结果

解释

  1. Message接口:定义了发送消息的方法 send
  2. TextMessage类:实现了Message接口,表示一个简单的文本消息。
  3. MessageDecorator抽象类:也是Message接口的实现,但它持有一个Message对象,并在其方法调用时委托给该对象。
  4. EncryptedMessageDecorator类:扩展MessageDecorator,通过重写 send 方法添加加密功能。
  5. LoggedMessageDecorator类:扩展MessageDecorator,通过重写 send 方法添加日志记录功能。

通过这种方式,我们可以在不修改原始类的情况下,为对象动态添加新功能。这提供了一种比继承更灵活、可扩展性更强的方式来增强对象的行为。

类图

装饰器模式(Decorator Pattern)是一种结构型设计模式,允许你通过将对象放入包装对象中来动态地添加行为,相比继承更加灵活。以下是装饰器模式的类图示例:

+----------------------------------+
|             Component            |
+----------------------------------+
| operation(): void                |
+----------------------------------+^||
+-----------------------------+
|         ConcreteComponent   |
+-----------------------------+
| operation(): void           |
+-----------------------------+△|
+-----------------------------+
|          Decorator           |
+-----------------------------+
| component: Component         |
| operation(): void           |
+-----------------------------+||
+-----------------------------+
|       ConcreteDecoratorA    |
+-----------------------------+
| operation(): void           |
| addedBehavior(): void       |
+-----------------------------+△|
+-----------------------------+
|       ConcreteDecoratorB    |
+-----------------------------+
| operation(): void           |
| addedBehavior(): void       |
+-----------------------------+

说明:

  1. Component(抽象构件)

    • 定义一个对象接口,可以给这些对象动态地添加职责。
    • operation() 是抽象操作,可以是接口或者抽象类。
  2. ConcreteComponent(具体构件)

    • 定义一个具体的对象,也可以给这个对象添加一些职责。
  3. Decorator(装饰器抽象类)

    • 持有一个 Component 对象的引用,并定义一个与 Component 接口一致的接口。
    • 可以用来装饰 Component 对象,增加其行为。
  4. ConcreteDecoratorA、ConcreteDecoratorB(具体装饰器)

    • 负责给具体构件对象添加额外的职责。

类图说明:

  • Component 是抽象构件角色,定义了对象接口。
  • ConcreteComponent 是具体构件角色,实现了 Component 接口的具体对象。
  • Decorator 是装饰器抽象类,持有一个 Component 对象的引用,并定义了与 Component 接口一致的接口。
  • ConcreteDecoratorA、ConcreteDecoratorB 是具体装饰器类,实现了 Decorator 定义的接口,负责给 Component 对象添加额外的职责。

装饰器模式的核心是通过组合而非继承来扩展对象的功能,使得动态添加功能更加灵活。

相关文章:

Java—装饰器模式

介绍 装饰器模式 装饰器模式(Decorator Pattern)是一种结构型设计模式,它允许你动态地将行为添加到现有的对象中,而无需修改其代码。装饰器模式提供了比继承更灵活的功能扩展方式。 主要角色 Component:定义一个对…...

服务器远程桌面经常连接不上,造成远程桌面连接不上的原因都有哪些

服务器远程桌面连接不稳定或经常连接不上是一个较为常见的技术问题,其可能的原因涉及多个层面,包括网络设置、服务器配置、系统安全等方面。下面将详细探讨一些可能造成远程桌面连接问题的主要原因: 首先,网络连接不稳定是导致远…...

C#|Maui|BootstrapBlazor|Bootstrap Blazor 组件库改模板 | Bootstrap Blazor 组件库改布局,该怎么改?

先copy一个项目下来:Bootstrap Blazor 组件库 一套基于 Bootstrap 和 Blazor 的企业级组件库 发现不是很满足我的需求,我要把右下角的admin移动到左边去,该怎么移动? 先改代码 点进去到Layout.razor 文档,改成如下&am…...

【Linux】I/O多路复用

文章目录 I/O多路复用select()select()缺点 poll()poll()缺点 epoll()LT(水平触发模式)ET(边缘触发模式)具体函数 I/O多路复用 多进程和多线程实现并发会消耗大量的资源,主进程/线程用于监听和接受连接,再创建多个子进程/子线程来完成与连接的各个客户端…...

ubuntu20.0.4下安装PyTorch

参考文档 https://datawhalechina.github.io/thorough-pytorch/%E7%AC%AC%E4%B8%80%E7%AB%A0/1.2%20PyTorch%E7%9A%84%E5%AE%89%E8%A3%85.html 1:安装Anaconda 登录Anaconda | Individual Edition,https://www.anaconda.com/download/success &#xff…...

Android屏幕旋转流程(1)

(1)Gsensor的注册和监听 App -->I2C过程:App通过SensorManager.getSystemServer调用到SystemSensorManager,SystemSensorManager通过jni调用到SensorManager.cpp,后通过binder调用到SensorService。SensorService通…...

JS常见的运算符有哪些?

在JavaScript中,常见的运算符可以分为以下几类: 算术运算符: :加法-:减法*:乘法/:除法%:取余(模运算):递增--:递减**:幂运…...

【scikit-learn入门指南】:机器学习从零开始

1. 简介 scikit-learn是一款用于数据挖掘和数据分析的简单高效的工具,基于NumPy、SciPy和Matplotlib构建。它能够进行各种机器学习任务,如分类、回归和聚类。 2. 安装scikit-learn 在开始使用scikit-learn之前,需要确保已经安装了scikit-le…...

MEMS:Lecture 17 Noise MDS

讲义 Minimum Detectable Signal (MDS) Minimum Detectable Signal(最小可检测信号)是指当信号-噪声比(Signal-to-Noise Ratio, SNR)等于1时的输入信号水平。简单来说,MDS 是一个系统能够分辨出信号存在的最低输入信号…...

Windows运维:找到指定端口的服务

运维过windows的或多或少都遇到过需要找到一个端口对应的服务,或者是因为端口占用,或者是想看下对应的服务是哪个,那么如何操作呢?看看本文吧。 1、按照端口找到进程ID 例如想找8000端口的进程ID netstat -ano | findstr :8000 2…...

Linux文件系统讲解!

一、Linux文件系统历史 1、在早期的时候Linux各种不同发行版拥有自己各自自定义的文件系统层级结构。 2、当我用Red hat转向玩Debian时,我进入/etc我都是懵的。 3、后来Linux社区做了一个标准、FHS(文件系统标准层次结构)。来帮助Linux系统的…...

mysql集群,两主两从,使用mysql-proxy实现读写分离

主从复制 一、IP规划 服务器IP备注master1192.168.100.131master2的从master2192.168.100.132master1的从slave1192.168.100.134slave1的从slave2192.168.100.135slave2的从mysql-proxy192.168.100.137 二、具体配置 1.master1 ​ 配置ip:192.168.100.131 ​ …...

Linux文本处理三剑客+正则表达式

Linux文本处理常用的3个命令,脚本或者文本处理任务中会用到。这里做个整理。 三者的功能都是处理文本,但侧重点各不相同,grep更适合单纯的查找或匹配文本,sed更适合编辑匹配到的文本,awk更适合格式化文本,对…...

Linux启动KKfileview文件在线浏览时报错:启动office组件失败,请检查office组件是否可用

目录 1、导论 2、报错信息 3、问题分析 4、解决方法 4.1、下载 4.2、安装步骤 1、导论 今天进行项目部署时,遇到了一个问题。在启动kkfileview时,出现了报错异常: 2024-06-09 06:36:44.765 ERROR 1 --- [ main] cn.keking.service.Of…...

React <> </>的用法

React &#xff1c;&#xff1e; &#xff1c;/&#xff1e;的用法 介绍为什么使用 <>&#xff1f;例子解释 关于顶级元素总结 介绍 在 React 中&#xff0c;使用 <> 表示一个空标签或片段&#xff08;Fragment&#xff09;&#xff0c;这是一个简洁的方式来包裹一…...

is not null 、StringUtils.isNotEmpty和StringUtils.isNotBlank之间的区别?

这三者主要是针对对象是否为空、是否为空串和是否为空白字符串有不同的功能。 is not null 只是说明该对象不为空&#xff0c;没有考虑是否为空串和空白字符串。 StringUtils.isNotEmpty检查字符串是否不为 null且长度大于零&#xff0c;不考虑字符串中的空白字符。 StringU…...

Git使用-gitlab上面的项目如何整到本地的idea中

场景 一般我们在开发项目或者接手某个项目时&#xff0c;基本都要接触Git&#xff0c;比如上传项目代码&#xff0c;下载同事给你的交接代码等等。 这是一个基本功&#xff0c;小小整理一下日常操作中的使用。 第一步&#xff1a;在 GitLab 上找到你要克隆的项目&#xff0c;复…...

活体检验API在Java、Python、PHP中的使用教程

活体检验API是一种基于生物特征的身份验证技术&#xff0c;通过分析和识别用户的生物信息来确认其身份。这种技术广泛应用于各种领域&#xff0c;如金融、安全、社交媒体等&#xff0c;以提高身份验证的安全性和准确性。以下是描述”活体检验API”背景的一些关键点&#xff1a;…...

智能计算系统-概述

1、人工智能技术分层 2、人工智能方向人才培养 3、课程体系的建议 4、智能系统课程对学生的价值 5、智能计算系统对老师的价值 6、什么是智能计算系统 7、智能计算系统的形态 8、智能计算系统具有重大价值 9、智能计算系统的三大困难 10、开创深度学习处理器方向 11、寒武纪的国…...

SM5101 SOP-8 充电+触摸+发执丝控制多合一IC触摸打火机专用IC

SM5101 SOP-8 2.7V 涓流充电 具电池过充过放 触摸控制 发热丝电流控制多功能为一体专用芯片 昱灿-海川 SM5101 SOP-8 充电触摸发执丝控制多合一IC触摸打火机方案 &#xff01;&#xff01;&#xff01; 简介&#xff1a; SM5101是一款针对电子点烟器的专用芯片&#xff0c;具…...

告别繁琐操作:一键下载国家中小学智慧教育平台电子课本的智能解决方案

告别繁琐操作&#xff1a;一键下载国家中小学智慧教育平台电子课本的智能解决方案 【免费下载链接】tchMaterial-parser 国家中小学智慧教育平台 电子课本下载工具&#xff0c;帮助您从智慧教育平台中获取电子课本的 PDF 文件网址并进行下载&#xff0c;让您更方便地获取课本内…...

从零搭建短剧生成AI

当AI遇上短剧创作&#xff0c;会产生怎样的火花&#xff1f;从抖音的1分钟小剧场到YouTube的3分钟微电影&#xff0c;短剧已成为最受欢迎的内容形式之一。而AI&#xff0c;正在让这种创作变得触手可及。AI时代的内容创作革命在数字内容爆炸式增长的时代&#xff0c;短剧以其紧凑…...

终极指南:如何使用Azure Quickstart Templates实现成本管理与预算警报

终极指南&#xff1a;如何使用Azure Quickstart Templates实现成本管理与预算警报 【免费下载链接】azure-quickstart-templates Azure Quickstart Templates 项目地址: https://gitcode.com/gh_mirrors/az/azure-quickstart-templates Azure Quickstart Templates是微软…...

深度重构黑苹果系统架构:OpenCore实战解析与性能优化

深度重构黑苹果系统架构&#xff1a;OpenCore实战解析与性能优化 【免费下载链接】Hackintosh 国光的黑苹果安装教程&#xff1a;手把手教你配置 OpenCore 项目地址: https://gitcode.com/gh_mirrors/hac/Hackintosh 在传统PC硬件与macOS系统兼容性的技术探索中&#xf…...

为AI智能体构建持久化记忆系统:基于RAG与向量检索的实践

1. 项目概述&#xff1a;为AI智能体构建持久化记忆系统在AI智能体&#xff08;AI Agent&#xff09;的开发浪潮中&#xff0c;一个核心的痛点日益凸显&#xff1a;如何让智能体拥有持续、可靠的记忆能力&#xff1f;无论是基于Claude API、GPTs还是其他大语言模型构建的对话机器…...

全景视频会议核心技术解析:从200°视场角到实时图像拼接

1. 项目概述&#xff1a;全景视频会议如何从概念走向现实视频会议这玩意儿&#xff0c;我们搞通信和消费电子这行的&#xff0c;这些年见得多了。从最早模糊不清的像素块&#xff0c;到后来高清但视角固定的摄像头&#xff0c;大家总觉得少了点什么。没错&#xff0c;少的就是那…...

华为2288H V5服务器折腾记:LSI SAS3008阵列卡的IT与IR模式到底该怎么选?

华为2288H V5服务器实战&#xff1a;LSI SAS3008阵列卡IT与IR模式深度解析 当你第一次接触华为2288H V5服务器时&#xff0c;那块小小的LSI SAS3008阵列卡可能会让你陷入选择困难——到底该用IT模式还是IR模式&#xff1f;这个问题看似简单&#xff0c;却直接影响着服务器的存储…...

【Midjourney Gouache风格终极指南】:20年AI绘画专家亲授7大参数黄金组合与3类易踩翻车点

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Gouache风格的本质解构与AI绘画语境迁移 Gouache&#xff08;水粉画&#xff09;并非简单意义上的“不透明水彩”&#xff0c;其本质在于颜料颗粒的物理遮盖性、媒介乳化稳定性与干湿叠压响应的三重耦合…...

广义逆矩阵:从A+与A-的数学定义到工程求解实践

1. 广义逆矩阵&#xff1a;工程师的数学工具箱 第一次听说"广义逆矩阵"这个概念时&#xff0c;我正在处理一个推荐系统的评分预测问题。当时遇到一个头疼的情况&#xff1a;用户-物品评分矩阵极其稀疏&#xff0c;直接求逆根本行不通。导师轻描淡写地说&#xff1a;&…...

从零构建开源语音AI交互中枢:EchoKit Server部署与调优指南

1. 项目概述&#xff1a;构建你自己的语音AI交互中枢 如果你对智能音箱、语音助手这类设备感兴趣&#xff0c;但又觉得市面上的产品要么功能封闭&#xff0c;要么隐私堪忧&#xff0c;那么今天聊的这个项目——EchoKit Server&#xff0c;可能会让你眼前一亮。简单来说&#x…...