装饰模式(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. 实际发送邮件
扩展建议:
- 可添加
RateLimitDecorator
实现发放频率控制 - 增加
FormatDecorator
处理奖励数据的格式化 - 使用
CircuitBreakerDecorator
实现熔断机制 - 通过配置中心动态调整装饰器组合顺序
这种模式特别适合需要动态组合多种预处理/后处理逻辑的场景,比继承方式更灵活,比责任链模式更易控制流程顺序。