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

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言

现在我们有个如下的需求,设计一个邮件发奖的小系统,

需求

1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件

在这里插入图片描述

装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。

1. 定义核心接口

// 1. 定义核心接口
interface RewardHandler {void handleReward(Reward reward);
}

2. 基础实现类

// 2. 基础实现类
class BasicRewardHandler implements RewardHandler {@Overridepublic void handleReward(Reward reward) {// 实际发送邮件的核心逻辑sendEmail(reward);}private void sendEmail(Reward reward) {System.out.println("发送邮件奖励:" + reward.getAmount() + " 个 " + reward.getType());}
}

3. 装饰器抽象类

// 3. 装饰器抽象类
abstract class RewardDecorator implements RewardHandler {private RewardHandler wrappee;public RewardDecorator(RewardHandler wrappee) {this.wrappee = wrappee;}@Overridepublic void handleReward(Reward reward) {wrappee.handleReward(reward);}
}

4. 具体装饰器实现(可组合使用)

// 4. 具体装饰器实现(可组合使用)
class ValidationDecorator extends RewardDecorator {public ValidationDecorator(RewardHandler wrappee) {super(wrappee);}@Overridepublic void handleReward(Reward reward) {if (validate(reward)) {super.handleReward(reward);}}private boolean validate(Reward reward) {System.out.println("验证奖励有效性: " + reward.getId());return reward.getAmount() > 0;}
}class LoggingDecorator extends RewardDecorator {public LoggingDecorator(RewardHandler wrappee) {super(wrappee);}@Overridepublic void handleReward(Reward reward) {System.out.println("[LOG] 开始处理奖励 " + reward.getId());super.handleReward(reward);System.out.println("[LOG] 奖励处理完成 " + reward.getId());}
}class EncryptionDecorator extends RewardDecorator {public EncryptionDecorator(RewardHandler wrappee) {super(wrappee);}@Overridepublic void handleReward(Reward reward) {Reward encryptedReward = encrypt(reward);super.handleReward(encryptedReward);}private Reward encrypt(Reward reward) {System.out.println("加密奖励数据: " + reward.getId());return new Reward(reward.getId(), reward.getType(), reward.getAmount(), AES.encrypt(reward.getData()));}
}

5. 使用示例

// 5. 使用示例
public class Main {public static void main(String[] args) {// 组合装饰器(验证 -> 日志 -> 加密 -> 核心处理)RewardHandler handler = new LoggingDecorator(new EncryptionDecorator(new ValidationDecorator(new BasicRewardHandler())));Reward reward = new Reward("20230605-001", "金币", 100);handler.handleReward(reward);}
}

关键设计点说明:

  1. 灵活扩展性:通过装饰器链式组合(如验证→加密→日志),可动态调整处理流程
  2. 单一职责原则:每个装饰器只关注单一功能(验证、加密、日志等)
  3. 开闭原则:新增处理逻辑时无需修改已有代码
  4. 运行时组合:可根据不同环境配置装饰器组合(生产环境加验证,测试环境不加加密)

典型处理流程:

1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件

扩展建议:

  • 可添加RateLimitDecorator实现发放频率控制
  • 增加 FormatDecorator 处理奖励数据的格式化
  • 使用CircuitBreakerDecorator实现熔断机制
  • 通过配置中心动态调整装饰器组合顺序

这种模式特别适合需要动态组合多种预处理/后处理逻辑的场景,比继承方式更灵活,比责任链模式更易控制流程顺序。

http://www.lqws.cn/news/171649.html

相关文章:

  • k8s安装ingress-nginx
  • 以STM32H7微控制器为例,简要说明stm32h7xx_it.c的作用
  • Transformer架构解析:Encoder与Decoder核心差异、生成式解码技术详解
  • App/uni-app 离线本地存储方案有哪些?最推荐的是哪种方案?
  • MADlib —— 基于 SQL 的数据挖掘解决方案(4)—— 数据类型之矩阵
  • Tomcat全方位监控实施方案指南
  • 《基于Apache Flink的流处理》笔记
  • Docker容器化技术概述与实践
  • 【Python工具开发】k3q_arxml 简单但是非常好用的arxml编辑器,可以称为arxml杀手包
  • Java + Spring Boot + Mybatis 实现批量插入
  • window安装docker
  • C#使用MindFusion.Diagramming框架绘制流程图(1):基础类型
  • Chrome安装代理插件ZeroOmega(保姆级别)
  • 如何理解机器人课程的技术壁垒~壁垒和赚钱是两件不同的事情
  • Chrome书签的导出与导入:步骤图
  • 浏览器工作原理01 [#]Chrome架构:仅仅打开了1个页面,为什么有4个进程
  • Chrome 浏览器前端与客户端双向通信实战
  • Flink在B站的大规模云原生实践
  • 学习STC51单片机29(芯片为STC89C52RCRC)
  • 【python深度学习】Day 46 通道注意力(SE注意力)
  • Verilog编程技巧01——如何编写三段式状态机
  • caliper中的测试文件写法及其注意事项
  • 【Java后端基础 005】ThreadLocal-线程数据共享和安全
  • 江科大读写内部flash到hal库实现
  • 【Go语言基础【5】】Go module概述:项目与依赖管理
  • Tesseract配置参数详解及适用场景(PyTesseract进行OCR)
  • Spring Boot消息系统开发指南
  • 语音合成之十九 为什么对数行列式的值可以作为Flow-based模型loss?
  • 三种读写传统xls格式文件开源库libxls、xlslib、BasicExcel的比较
  • leetcode 2434. 使用机器人打印字典序最小的字符串 中等