前言
現在我們有個如下的需求,設計一個郵件發獎的小系統,
需求
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
實現熔斷機制 - 通過配置中心動態調整裝飾器組合順序
這種模式特別適合需要動態組合多種預處理/后處理邏輯的場景,比繼承方式更靈活,比責任鏈模式更易控制流程順序。