裝飾模式(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.pswp.cn/news/909229.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/909229.shtml
英文地址,請注明出處:http://en.pswp.cn/news/909229.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

項目四.高可用集群_ansible

設備準備 安裝wordpress [rootlocalhost ~]# nmcli c del "Wired connection 1" [rootlocalhost ~]# nmcli c add type ethernet ifname ens224 con-name ens224 ipv4.method manual ipv4.addr 192.168.88.40/24 gw4 192.168.88.1 autoconnect true [rootlocalhos…

TensorFlow深度學習實戰(21)——Transformer架構詳解與實現

TensorFlow深度學習實戰(21)——Transformer架構詳解與實現 0. 前言1. Transformer 架構1.1 關鍵思想1.2 計算注意力1.3 編碼器-解碼器架構1.4 Transformer 架構1.5 模型訓練 2. Transformer 類別2.1 解碼器(自回歸)模型2.2 編碼器(自編碼)模型2.3 Seq2s…

20250608-在 Windows 上使用 PyCharm 通過 SSH 連接到遠程 Ubuntu 機器的 Anaconda 環境

在 Windows 上使用 PyCharm 通過 SSH 連接到遠程 Ubuntu 機器的 Anaconda 環境 1. 確保遠程機器上的 SSH 服務已啟動 在遠程 Ubuntu 機器上,確保 SSH 服務已安裝并啟動: sudo apt-get install openssh-server sudo systemctl start ssh sudo systemct…

Oracle 條件索引 case when 報錯解決方案(APP)

文章目錄 環境文檔用途詳細信息 環境 系統平臺:Linux x86-64 Red Hat Enterprise Linux 7 版本:4.5 文檔用途 本內容介紹 Oracle條件索引 case when 如何在HGDB中轉換使用。 詳細信息 1、oracle 索引 create unique index I_GL_VOUCHER_7 on gl_vo…

鴻蒙期末總結

一、概念 HarmonyOS應用關鍵概念:元服務和App的關系 App具有手動下載安裝、包大小無限制、應用內或應用市場更新、全量功能等特征,可使用全量API 元服務具有免安裝、包大小有限制、即用即走、輕量化等特征,只能使用“元服務API集” 鴻蒙的…

Vue3 + TypeScript + Element Plus 表格行按鈕不觸發 row-click 事件、不觸發勾選行,只執行按鈕的 click 事件

點擊表格行按鈕不觸發 row-click 事件、不觸發勾選行&#xff0c;只執行按鈕的 click 事件 點擊第一行的【編輯】&#xff0c;第一行為當前選擇行&#xff0c; 同時也勾選了復選框&#xff0c;也會執行 row-click 事件 原來的代碼&#xff1a; <el-table-column label"…

SiteAzure4.x 版本 訪問html靜態頁文件出現404錯誤

問題描述&#xff1a; SiteAzure4.*版本&#xff0c;在upload文件夾中放置了html靜態頁文件&#xff0c;訪問出現404錯誤 問題分析&#xff1a; 1、確認訪問路徑是否正確以及文件是否存在 2、確認相應文件夾權限是否正確 3、確認IIS默認文檔是否允許靜態頁&#xff0c;MIM…

[免費]微信小程序音樂播放器(爬取網易云音樂數據)(node.js后端)【論文+源碼】

大家好&#xff0c;我是java1234_小鋒老師&#xff0c;看到一個不錯的微信小程序音樂播放器(爬取網易云音樂數據)(node.js后端)&#xff0c;分享下哈。 項目視頻演示 【免費】微信小程序音樂播放器(爬取網易云音樂數據)(node.js后端) 微信小程序畢業設計_嗶哩嗶哩_bilibili …

強化學習:策略梯度概念

2.策略梯度方法 目標是使策略 不斷更新&#xff0c;回報更高。 計算每一個軌跡的回報&#xff0c;和對應的概率 目標是使回報高的軌跡概率應該高。這樣整個策略的期望回報也會高。 什么是策略期望回報&#xff1f; 就是用這個策略跑了若干個軌跡&#xff0c;得到回報&#x…

Java 中高級開發崗技能與面試要點梳理

目錄 一、核心技術深度掌握 (一)Java 語言高階特性 JVM 底層原理剖析 并發編程高級應用 Java 新特性實戰 (二)主流框架與中間件精通 Spring 生態全面掌控 分布式中間件實戰精通 (三)數據庫與存儲優化專家 SQL 與 ORM 高級應用 分庫分表實戰 NoSQL 實戰(Elas…

職場生存發展指南 | 邊界 / 責任 / 社交 / 情緒

注&#xff1a;本文為“職場生存發展”相關合輯。 略作重排&#xff0c;未整理去重。 如有內容異常&#xff0c;請看原文。 職場生存發展指南 | 邊界 / 責任 / 社交 / 情緒 職場如江湖&#xff0c;充滿機遇與挑戰。在單位中立足&#xff0c;需深諳生存智慧——既要守住底線、…

vue3 daterange正則踩坑

<el-form-item label"空置時間" prop"vacantTime"> <el-date-picker v-model"form.vacantTime" type"daterange" start-placeholder"開始日期" end-placeholder"結束日期" clearable :editable"fal…

linux中執行腳本命令的source和“.”和“./”的區別

在 Linux 或類 Unix 系統中&#xff0c;source、. 和 ./ 的使用場景各有不同&#xff0c;以下詳細介紹何時使用它們&#xff1a; 命令用途適合場景source和“.”等效。腳本在當前 shell 環境中執行并影響當前 shell 的狀態和環境變量 1. 加載環境變量配置文件&#xff0c;無需…

games101 hw1

原理 背景 將三維空間中一個旋轉的三角形&#xff0c;顯示在屏幕上。 假設三角形初始點位為 v0(2.0, 0.0, ?2.0), v1(0.0, 2.0, ?2.0), v2(?2.0, 0.0, ?2.0), 你需要將這三個點的坐標變換為屏幕坐標并在屏幕上繪制出對應的線框三角形。 mvp AI回答&#xff1a; 在計算機…

Mybatis逆向工程詳解(附源碼文件)動態創建實體類、條件擴展類、Mapper接口、Mapper.xml映射文件

今天呢&#xff0c;博主的學習進度也是步入了Java Mybatis 框架&#xff0c;目前正在逐步楊帆旗航。 那么接下來就給大家出一期有關 Mybatis 逆向工程的教學&#xff0c;希望能對大家有所幫助&#xff0c;也特別歡迎大家指點不足之處&#xff0c;小生很樂意接受正確的建議&…

android studio中修改java邏輯對應配置的xml文件

在android studio新建一個activity&#xff0c;自動生成一個xml&#xff0c;可以更改到另一個xml嗎&#xff1f; 可以。 新建一個activity&#xff1a; 如下 上圖中的activity_second為xml文件&#xff0c;SecondActivity為java文件。點擊后&#xff0c; AndroidManifest.x…

@SchedulerLock處理Spring Task在分布式環境下的重復執行問題

本文大綱&#x1f4d6; 1、背景&#x1f342;2、SchedulerLock注解3、實現原理 1、背景&#x1f342; Spring生態下&#xff0c;日常開發定時任務&#xff0c;使用Spring Task框架還是很常見的選擇&#xff0c;但Spring Task并不是為分布式環境設計的&#xff0c;分布式環境下…

Prompt工程指南中文版

Prompt-Engineering-Guide-zh Prompt工程指南中文版 github 本文翻譯改編自 Dair-ai/Prompt-Engineering-Guide 中文原帖地址為 大型語言模型Prompt書寫指南 為了方便理解以及補充缺少的知識點&#xff0c;內容有所添改。除非另有說明&#xff0c;本文中所有的例子都是使用te…

「pandas 與 numpy」數據分析與處理全流程【數據分析全棧攻略:爬蟲+處理+可視化+報告】

- 第 106 篇 - Date: 2025 - 06 - 12 Author: 鄭龍浩&#xff08;仟墨&#xff09; 文中使用的所有文件在文章頂部的資源展示 數據分析與處理 「pandas 與 numpy」 文章目錄 數據分析與處理 「pandas 與 numpy」一了解數據處理1 數據處理2 數據分析第三方庫 二 numpy1 基本介紹…

Fastapi + vue3 自動化測試平臺(6):AI + Web UI的完美結合

&#x1f916;? AI Web自動化革命&#xff1a;用自然語言重塑測試體驗&#xff01; 基于FastAPI Vue3的下一代Web自動化測試平臺誕生&#xff01;將大語言模型 與 Web UI自動化深度結合&#xff0c;讓測試腳本維護進入自然語言時代 —— 告別繁瑣代碼&#xff0c;擁抱智能測…