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

网站设计制作软件江门自助建站模板

网站设计制作软件,江门自助建站模板,济南赢动网站建设,5万左右的新能源电动汽车以下是一个结合装饰器模式解决实际开发问题的Java实现案例,涵盖动态扩展功能、多层装饰顺序控制、性能优化等场景需求,附带逐行中文注释: 场景描述 开发一个数据加密传输系统,需满足: 基础功能:原始数据传…

以下是一个结合装饰器模式解决实际开发问题的Java实现案例,涵盖动态扩展功能、多层装饰顺序控制、性能优化等场景需求,附带逐行中文注释:

场景描述

开发一个数据加密传输系统,需满足:
基础功能:原始数据传输
加密扩展:支持AES、Base64、GZIP等加密/压缩组合
动态配置:运行时自由组合加密流程(如AES→GZIP→Base64)
性能监控:统计加密过程耗时
顺序控制:防止重复包装(如多次AES加密)

完整代码实现

import java.util.*;/*** 数据处理器抽象接口(Component)*/
interface DataProcessor {// 处理数据byte[] process(byte[] data) throws Exception;// 获取当前处理类型(用于顺序校验)String getProcessorType();
}/*** 基础实现:原始数据传输(ConcreteComponent)*/
class RawDataProcessor implements DataProcessor {@Overridepublic byte[] process(byte[] data) {System.out.println("传输原始数据,大小:" + data.length + "字节");return data;}@Overridepublic String getProcessorType() {return "RAW";}
}/*** 加密装饰器抽象类(Decorator)*/
abstract class EncryptionDecorator implements DataProcessor {protected final DataProcessor wrapped;private final String type;//这个type不推荐自己装饰使用,耦合度以及复杂度太大,需要开发人员自己保证装饰器不重复,重复了也正常执行。//并且如果A装饰B,B装饰C就不能约束住代码了。protected EncryptionDecorator(DataProcessor wrapped, String type) { this.wrapped = validateWrapped(wrapped, type);this.type = type;}// 装饰顺序校验:防止重复包装同类处理器private DataProcessor validateWrapped(DataProcessor processor, String newType) {if (processor.getProcessorType().equals(newType)) {throw new IllegalArgumentException("禁止重复添加" + newType + "处理器");}return processor;}@Overridepublic String getProcessorType() {return type;}
}// ------------------- 具体装饰器实现 -------------------/*** AES加密装饰器(ConcreteDecorator)*/
class AESEncryptor extends EncryptionDecorator {public AESEncryptor(DataProcessor processor) {super(processor, "AES");}@Overridepublic byte[] process(byte[] data) throws Exception {System.out.println("【AES加密】输入数据大小:" + data.length + "字节");byte[] processed = wrapped.process(data);// 模拟AES加密(实际应使用加密库)byte[] encrypted = Arrays.copyOf(processed, processed.length + 16); // +16模拟加密后长度System.out.println("【AES加密】输出数据大小:" + encrypted.length + "字节");return encrypted;}
}/*** Base64编码装饰器(ConcreteDecorator)*/
class Base64Encoder extends EncryptionDecorator {public Base64Encoder(DataProcessor processor) {super(processor, "BASE64");}@Overridepublic byte[] process(byte[] data) throws Exception {System.out.println("【Base64编码】输入数据大小:" + data.length + "字节");byte[] processed = wrapped.process(data);// 模拟Base64编码(实际应使用Base64库)String encoded = new String(processed) + "_base64";System.out.println("【Base64编码】输出数据大小:" + encoded.length() + "字节");return encoded.getBytes();}
}/*** GZIP压缩装饰器(ConcreteDecorator)*/
class GZIPCompressor extends EncryptionDecorator {public GZIPCompressor(DataProcessor processor) {super(processor, "GZIP");}@Overridepublic byte[] process(byte[] data) throws Exception {System.out.println("【GZIP压缩】输入数据大小:" + data.length + "字节");byte[] processed = wrapped.process(data);// 模拟压缩(实际应使用GZIP库)byte[] compressed = Arrays.copyOfRange(processed, 0, processed.length / 2);System.out.println("【GZIP压缩】输出数据大小:" + compressed.length + "字节");return compressed;}
}/*** 监控装饰器(扩展功能)*/
class MonitoringDecorator implements DataProcessor {private final DataProcessor wrapped;private long processTime;public MonitoringDecorator(DataProcessor processor) {this.wrapped = processor;}@Overridepublic byte[] process(byte[] data) throws Exception {long start = System.nanoTime();byte[] result = wrapped.process(data);processTime = System.nanoTime() - start;return result;}@Overridepublic String getProcessorType() {return "MONITOR";}public long getProcessTime() {return processTime;}
}// ------------------- 装饰器工厂(解决顺序问题) -------------------
// 建造者模式,这里其实也可以拓展一个抽象工厂,不过会使复杂度几何增加
//如果当前以及未来设计装饰产品族不够多的情况下建议不适用工厂
class ProcessorBuilder {private DataProcessor processor;private final Set<String> addedTypes = new HashSet<>();public ProcessorBuilder(DataProcessor baseProcessor) {this.processor = baseProcessor;addedTypes.add(baseProcessor.getProcessorType());}public ProcessorBuilder addAES() {return addDecorator(new AESEncryptor(processor), "AES");}public ProcessorBuilder addBase64() {return addDecorator(new Base64Encoder(processor), "BASE64");}public ProcessorBuilder addGZIP() {return addDecorator(new GZIPCompressor(processor), "GZIP");}public ProcessorBuilder addMonitoring() {return addDecorator(new MonitoringDecorator(processor), "MONITOR");}private ProcessorBuilder addDecorator(DataProcessor decorator, String type) {if (!addedTypes.add(type)) {throw new IllegalStateException(type + "处理器已存在");}this.processor = decorator;return this;}public DataProcessor build() {return processor;}
}// ------------------- 客户端代码 -------------------
public class DecoratorPatternDemo {public static void main(String[] args) throws Exception {// 构建处理链:原始数据 → AES → GZIP → Base64 → 监控DataProcessor processor = new ProcessorBuilder(new RawDataProcessor()).addAES().addGZIP().addBase64().addMonitoring().build();// 测试数据处理byte[] originalData = "Hello Decorator Pattern!".getBytes();byte[] result = processor.process(originalData);// 获取监控数据,这里能成功的原因是因为最后加入Monitoring,数据类型变成这种if (processor instanceof MonitoringDecorator) {long nanos = ((MonitoringDecorator) processor).getProcessTime();System.out.printf("\n处理耗时:%.2f ms", nanos / 1_000_000.0);}// 测试异常情况:重复添加处理器try {new ProcessorBuilder(new RawDataProcessor()).addAES().addAES(); // 触发重复添加异常} catch (IllegalStateException e) {System.out.println("\n异常捕获:" + e.getMessage());}}
}

真实场景问题解决

问题类型解决方案
功能组合爆炸 -动态组合装饰器,避免继承导致的类膨胀
装饰顺序敏感 -通过Builder控制添加顺序,构造函数校验重复类型
性能监控困难 -添加非侵入式监控装饰器
代码侵入性高 -核心类保持纯净,扩展功能通过装饰器实现
维护成本高 -每个装饰器独立维护,符合单一职责原则
多层嵌套调试困难-为每个装饰器添加日志输出,清晰展示处理流程

装饰器模式优势分析

动态扩展能力

// 运行时自由组合加密流程
DataProcessor p1 = new AESEncryptor(new GZIPCompressor(new RawDataProcessor()));
DataProcessor p2 = new Base64Encoder(new AESEncryptor(new RawDataProcessor()));

符合开闭原则

新增功能:只需添加新的装饰器类
原有代码:无需修改核心组件和已有装饰器
替代多重继承

传统继承方式:
AES_GZIP_Processor
AES_Base64_Processor
GZIP_Base64_Processor
...

装饰器模式:
AESEncryptor → GZIPCompressor → Base64Encoder
职责清晰分离
每个装饰器只关注单一功能
业务逻辑与基础设施分离(如加密算法与性能监控)
性能优化技巧
缓存装饰器实例

class DecoratorCache {private static Map<String, DataProcessor> cache = new ConcurrentHashMap<>();public static DataProcessor getDecorator(DataProcessor base, String type) {String key = base.hashCode() + "_" + type;return cache.computeIfAbsent(key, k -> createDecorator(base, type));}
}

异步处理装饰器

class AsyncDecorator implements DataProcessor {private final Executor executor = Executors.newCachedThreadPool();public byte[] process(byte[] data) {executor.execute(() -> wrapped.process(data));return data; // 立即返回,异步处理}
}

批量处理优化

class BatchDecorator implements DataProcessor {public byte[] process(byte[] data) {// 将大数据拆分为块处理byte[][] chunks = splitData(data);Arrays.parallelSetAll(chunks, i -> wrapped.process(chunks[i]));return combineChunks(chunks);}
}

模式对比

模式核心思想装饰器模式特点
适配器模式接口转换不改变接口,只增强功能
代理模式控制访问透明增强,客户端无感知
策略模式算法替换动态叠加算法而非替换
组合模式树形结构装饰器链是线性结构

行业应用案例

Java IO流体系

InputStream in = new BufferedInputStream(new GZIPInputStream(new FileInputStream("data.gz")));

Web中间件

HttpServletRequest wrappedRequest = new LoggingRequestWrapper(new CachingRequestWrapper(new XSSFilterWrapper(rawRequest)));

游戏装备系

Weapon weapon = new LaserSight(new ExtendedMagazine(new BaseRifle()));

通过这个案例可以看出,装饰器模式在需要动态增强对象功能且要求扩展灵活的场景中表现优异。实际开发中建议:
控制装饰层数:避免过度嵌套影响性能
明确装饰顺序:通过Builder等模式管理
注意对象标识:装饰后会改变对象hashCode/equals行为
结合其他模式:如工厂模式创建装饰器链

一句话总结

装饰器模式是通过组合的方式将一个实现了共同接口或抽象类的对象进行包装,并在执行时按照装饰的顺序进行递归调用,以实现功能的动态扩展。

http://www.dtcms.com/a/539987.html

相关文章:

  • 滨州做网站推广h5制作方法
  • KTM5800——30bit 绝对角度细分器支持最多 4096 对极与一键非线性自校准集成双 16bit 2M SAR ADC,可替代TW29
  • 局域网网站制作保定哪有做网站的
  • 基于LPJ模型的植被NPP模拟、驱动力分析及其气候变化响应预测
  • 人脸识别4-Windows下基于MSVC编译SeetaFace6
  • 【AES加密】AES加密算法流程全解析
  • 5.1.4 大数据方法论与实践指南-主流湖仓一体商业化解决方案
  • 【数据库】异构多活+双轨并行:浙人医基于金仓KFS实现数据库信创平滑升级
  • Python实用装饰器提升开发效率
  • 【JAVA 进阶】Mybatis-Plus 实战使用与最佳实践
  • LangGraph 官方教程:聊天机器人之五
  • 天硕工业SSD揭秘无DRAM缓存SSD的性能差距
  • C# 内存是绝对自动清理吗?
  • 在 CentOS 系统上实现定时执行 Python 邮件发送任务完整指南
  • C#操作Excel
  • 放置在网站根目录下中国做外贸最好的网站有哪些
  • 二叉搜索树,咕咕咕
  • 可用 Docker (DockerHub) 国内镜像源加速列表 - 长期维护(截至 2025 年 06 月 15 日)
  • QtQuick3D入门(5):实例化渲染
  • 浙人医基于金仓 KFS 工具信创落地:多数据库协同难题解决方案详讲
  • [C++STL] :list的简介和使用
  • Nacos配置中心实战进阶:多场景动态刷新全解析
  • Linux写sh开机启动脚本-bash报错的两种解决方法
  • 注册协议通知
  • wordpress网站部署百度一下一下你就知道
  • 健康濮阳门户网站建设装企erp管理系统
  • C++ stack和queue之OJ题目
  • 【网络】在windows下,使用自带的ftp服务器,并添加账户
  • 基于python大数据的网络新闻可视化及分析系统
  • 6.1.1.3 大数据方法论与实践指南-SparkStreaming 任务优化实践