装饰器模式的适用场景示例

1. 动态扩展和撤销类的功能

假设我们有一个 ApiRequest 类,用于发送 HTTP 请求。在某些场景下,我们希望对传输的数据进行加密以提高安全性,但在其他场景下不需要加密。通过装饰器模式,可以轻松地在需要时动态扩展这个功能,并在不需要时撤销它。

  • 场景实现
    • ApiRequest 类负责发送普通的 HTTP 请求。
    • EncryptionDecorator 装饰器类可以在需要时对数据进行加密。
    • 当请求的安全性要求高时,可以使用 EncryptionDecorator 对请求进行加密;否则直接使用 ApiRequest
// API请求接口
public interface ApiRequest {void sendRequest(String data);
}// 基础API请求类
public class BasicApiRequest implements ApiRequest {@Overridepublic void sendRequest(String data) {System.out.println("发送请求: " + data);}
}// 加密装饰器
public class EncryptionDecorator implements ApiRequest {private ApiRequest wrappedRequest;public EncryptionDecorator(ApiRequest wrappedRequest) {this.wrappedRequest = wrappedRequest;}@Overridepublic void sendRequest(String data) {String encryptedData = encrypt(data);wrappedRequest.sendRequest(encryptedData);}private String encrypt(String data) {return "加密数据(" + data + ")";}
}
  • 使用示例
public class Main {public static void main(String[] args) {ApiRequest basicRequest = new BasicApiRequest();// 如果需要加密功能ApiRequest secureRequest = new EncryptionDecorator(basicRequest);secureRequest.sendRequest("敏感信息"); // 输出: 发送请求: 加密数据(敏感信息)// 如果不需要加密功能basicRequest.sendRequest("普通信息"); // 输出: 发送请求: 普通信息}
}
  • 效果:通过装饰器模式,可以在运行时动态地添加或撤销加密功能,满足了场景中对安全性要求的不同需求。
2. 无法通过继承扩展类的场景

有时我们无法继承一个类,例如该类被声明为 final。装饰器模式在这种情况下提供了一个解决方案,通过组合的方式对类进行功能扩展,而不是通过继承。

  • 场景实现
    假设我们有一个 finalReportGenerator,负责生成报表。现在,我们想要在生成的报表内容前后添加公司信息和时间戳等装饰信息。
// 最终报表生成类
public final class ReportGenerator {public String generate() {return "报表内容";}
}// 报表装饰器接口
public interface ReportDecorator {String generateReport();
}// 公司信息装饰器
public class CompanyInfoDecorator implements ReportDecorator {private ReportGenerator reportGenerator;public CompanyInfoDecorator(ReportGenerator reportGenerator) {this.reportGenerator = reportGenerator;}@Overridepublic String generateReport() {return "公司信息: ABC公司\n" + reportGenerator.generate();}
}// 时间戳装饰器
public class TimestampDecorator implements ReportDecorator {private ReportGenerator reportGenerator;public TimestampDecorator(ReportGenerator reportGenerator) {this.reportGenerator = reportGenerator;}@Overridepublic String generateReport() {return reportGenerator.generate() + "\n生成时间: " + System.currentTimeMillis();}
}
  • 使用示例
public class Main {public static void main(String[] args) {ReportGenerator report = new ReportGenerator();// 添加公司信息ReportDecorator companyReport = new CompanyInfoDecorator(report);System.out.println(companyReport.generateReport());// 添加时间戳ReportDecorator timestampedReport = new TimestampDecorator(report);System.out.println(timestampedReport.generateReport());}
}
  • 效果:即使 ReportGenerator 类是 final 的,装饰器模式依然允许我们灵活地对报表内容进行增强,使得装饰内容可根据需求动态组合和独立变化,避免了对类进行继承扩展的局限。

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

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

相关文章

【建造&机械】木材运输车辆检测系统源码&数据集全套:改进yolo11-GhostHGNetV2

改进yolo11-SPPF-LSKA等200全套创新点大全:木材运输车辆检测系统源码&数据集全套 1.图片效果展示 项目来源 人工智能促进会 2024.10.28 注意:由于项目一直在更新迭代,上面“1.图片效果展示”和“2.视频效果展示”展示的系统图片…

C++与现代开发实践第三节:多线程与并发编程

第四章:C与现代开发实践 第三节:多线程与并发编程 在这一课中,我们将详细探讨多线程与并发编程的各个方面,特别是从线程的创建、管理到高级的优化技术,并且通过复杂的实战案例来展示如何应对并发问题。最后&#xff…

python实现放烟花效果庆祝元旦

马上就要2025年元旦啦,提前祝大家新年快乐 完整代码下载地址:https://download.csdn.net/download/ture_mydream/89926458

Prompt提示词设计:如何让你的AI对话更智能?

Prompt设计:如何让你的AI对话更智能? 在人工智能的世界里,Prompt(提示词)就像是一把钥匙,能够解锁AI的潜力,让它更好地理解和响应你的需求。今天,我们就来聊聊如何通过精心设计的Pr…

使用 Spring Doc 为 Spring REST API 生成 OpenAPI 3.0 文档

Spring Boot 3 整合 springdoc-openapi 概述 springdoc-openapi 是一个用于自动生成 OpenAPI 3.0 文档的库,它支持与 Spring Boot 无缝集成。通过这个库,你可以轻松地生成和展示 RESTful API 的文档,并且可以使用 Swagger UI 或 ReDoc 进行…

数据仓库建设 : 主题域简介

在数据仓库建设中,主题域(Subject Area)是根据业务需求和数据特点划分的数据区域,每个主题域代表一个特定的业务领域或功能模块。 主题域是数据模型的一个重要概念,它帮助构建逻辑清晰、层次分明的数据结构。主题域的设…

在数据库访问中,使用localhost、127.0.0.1和IP地址有什么差异

在数据库访问中,使用127.0.0.1和IP地址(在本地环境中通常指的是局域网IP或环回地址)的速度差异,实际上是非常微小的,甚至在很多情况下可以忽略不计。不过,为了更深入地理解这个问题,我们可以从以…

用python将pdf转成图片转换成对应的word文件

*科管系统**报告只能上传word,但是有些盖章文件只有pdf版本,因此有这个需求,目前市面上没这软件,只能自己python写一个。 要将PDF中的页面以图片的形式存储到Word文档中,你需要完成以下几个步骤: 从PDF中…

Java虚拟机的历程(jvm01)

Java虚拟机的历程(jvm01) Java虚拟机(JVM)作为Java语言的核心技术之一,自诞生以来经历了多次迭代与演变。不同的虚拟机在性能、功能以及适用场景上各有侧重。本文将介绍Java虚拟机发展历程中的一些重要虚拟机&#xf…

【设计模式】Liskov替换原则

文章目录 LSP原则的定义关键点示例遵循LSP原则的示例示例2结论 Liskov替换原则(Liskov Substitution Principle,简称LSP)是面向对象设计中的五大基本原则之一,由Barbara Liskov在1987年提出。LSP原则的核心思想是: 子…

部署RocketMQ, 其实很简单 (带图, 附启动命令)

目录 一 下载 RocketMQ 二 上传解压 2.1 文件上传 2.2 文件解压 三 配置RocketMQ 3.1 修改runserver.sh 3.2 修改runbroker.sh 3.3 配置环境变量 四 启动RocketMQ 4.1 启动namesrv服务 4.2 启动broker 服务 五 关闭RocketMQ 一 下载 RocketMQ 官网下载…

双十一有哪些值得入手的好物?盘点五款优惠又好用的好物推荐!

一眨眼,2024年双十一已经到来。自古以来,双十一不仅是购物狂欢的节日,更是消费者们尽情享受优惠和好物的绝佳时机。在这个热潮中,很多人都会提前准备好购物清单,寻觅心仪的商品。为了帮助大家在这个购物节中不空手而归…

11106 操作(c)

经验值:2000 时间限制:1000毫秒 内存限制:512MB 安徽省2024年信息学竞赛试题(初中组) 不许抄袭,一旦发现,直接清空经验! 题目描述 Description 小可可有一个长度为 nn 的初始都为 00 的数组和从左到右…

全网最简单的Java设计模式【九】原型模式深入解析

如果觉得本文能够帮到您,请关注🌟、点赞👍、收藏📚,让这份美好延续下去! 一、引言 在 Java 软件开发中,设计模式起着至关重要的作用,它们为解决各种常见的软件设计问题提供了经过验…

【AIGC】ChatGPT提示词Prompt精确控制指南:Scott Guthrie的建议详解与普通用户实践解析

博客主页: [小ᶻZ࿆] 本文专栏: AIGC | ChatGPT 文章目录 💯前言💯斯科特古斯里(Scott Guthrie)的建议解读人机交互设计的重要性减轻用户认知负担提高Prompt的易用性结论 💯普通用户视角的分析普通用户…

MySQL(2)【库的操作】

阅读导航 引言一、创建数据库1. 基本语法2. 创建数据库案例📌创建名为db1的数据库📌创建一个使用utf8字符集的db2数据库📌创建一个使用utf8字符集,并带校对规则的db3数据库 二、字符集和校验规则1. 查看系统默认字符集以及校验规则…

Python入门——yield生成器和iter迭代器

yield生成器 yield 的作用 生成器函数:yield 将一个普通的函数变成一个生成器函数。生成器函数与普通函数的区别在于,普通函数使用 return 一次性返回结果并终止,而生成器函数使用 yield 返回一个值后,会记住函数的执行状态&…

铜业机器人剥片 - SNK施努卡

SNK施努卡有色行业电解车间铜业机器人剥片 铜业机器人剥片技术是针对传统人工剥片效率低下、工作环境恶劣及生产质量不稳定的痛点而发展起来的自动化解决方案。 面临人工剥片的诸多挑战,包括低效率、工作环境差、人员流动大以及产品质量控制不精确等问题。 人工剥片…

电机学习-空间矢量合成

一、标量转换理论 设三相标量为 x a , x b , x c x_a,x_b,x_c xa​,xb​,xc​,且满足 x a x b x c 0 x_ax_bx_c 0 xa​xb​xc​0,则有变换: X o u t x a a x b a 2 x c , 其中 a e j 2 3 π , a 2 e − j 2 3 π X_{out}x_aax_ba^2…

深度学习调参大法

目录 trick 1:深度学习调参核心点trick 2:关于 深度学习Model选型问题trick 3:关于数据trick 4:关于调参 4.1 关于 Loss function 调参策略4.2 关于 Learning rate 和 batch size 调参策略4.3 关于 Epoch number 和 early stoppi…