抽象工廠模式與策略模式結合使用小案例

目錄

    • 1.前言
    • 1.示例說明
      • 1.1定義通用接口
      • 1.2 定義抽象工廠
      • 1.3 支付寶實現
      • 1.4 微信實現
      • 1.5 客戶端使用代碼(組合使用)
      • 1.6 示例結果輸出
      • 1.7 總結

1.前言

???????上一篇章就通過簡單的案例來了解抽象工廠模式和策略模式的使用,現在就用個支付場景的小案例來演示兩者設計模式的聯合使用;

1.示例說明

???????一個支付系統支持微信,支付寶,銀聯,數字人民幣等多渠道的支付,但是每個支付渠道,在大致的流程上都相差無異,比如支付的處理,參數,秘鑰等校驗,日志的跟蹤;

1.1定義通用接口

// 支付處理器
public interface PaymentProcessor {void processPayment(double amount);
}// 風控策略接口(策略模式)
public interface RiskControl {void checkRisk();
}// 日志記錄器
public interface Logger {void log(String message);
}

1.2 定義抽象工廠

public interface PaymentFactory {PaymentProcessor createProcessor();RiskControl createRiskControl(); // 策略模式接口Logger createLogger();
}

1.3 支付寶實現

// 支付寶支付處理器
public class AlipayProcessor implements PaymentProcessor {public void processPayment(double amount) {System.out.println("使用支付寶處理支付:" + amount + " 元");}
}// 支付寶風控策略
public class AlipayRiskControl implements RiskControl {public void checkRisk() {System.out.println("支付寶風控檢查通過");}
}// 支付寶日志
public class AlipayLogger implements Logger {public void log(String message) {System.out.println("支付寶日志:" + message);}
}// 支付寶工廠(組合策略)
public class AlipayPaymentFactory implements PaymentFactory {public PaymentProcessor createProcessor() {return new AlipayProcessor();}public RiskControl createRiskControl() {return new AlipayRiskControl();}public Logger createLogger() {return new AlipayLogger();}
}

1.4 微信實現

public class WeChatProcessor implements PaymentProcessor {public void processPayment(double amount) {System.out.println("使用微信處理支付:" + amount + " 元");}
}public class WeChatRiskControl implements RiskControl {public void checkRisk() {System.out.println("微信風控檢查通過");}
}public class WeChatLogger implements Logger {public void log(String message) {System.out.println("微信日志:" + message);}
}public class WeChatPaymentFactory implements PaymentFactory {public PaymentProcessor createProcessor() {return new WeChatProcessor();}public RiskControl createRiskControl() {return new WeChatRiskControl();}public Logger createLogger() {return new WeChatLogger();}
}

1.5 客戶端使用代碼(組合使用)

public class PaymentService {private final PaymentProcessor processor;private final RiskControl riskControl; // 策略注入private final Logger logger;public PaymentService(PaymentFactory factory) {this.processor = factory.createProcessor();this.riskControl = factory.createRiskControl(); // 策略模式this.logger = factory.createLogger();}public void pay(double amount) {logger.log("開始支付流程");riskControl.checkRisk(); // 策略模式核心調用processor.processPayment(amount);logger.log("支付完成");}public static void main(String[] args) {// 使用支付寶PaymentFactory alipayFactory = new AlipayPaymentFactory();PaymentService alipayService = new PaymentService(alipayFactory);alipayService.pay(100.0);System.out.println("---------");// 使用微信PaymentFactory weChatFactory = new WeChatPaymentFactory();PaymentService weChatService = new PaymentService(weChatFactory);weChatService.pay(200.0);}
}

1.6 示例結果輸出

支付寶日志:開始支付流程
支付寶風控檢查通過
使用支付寶處理支付:100.0 元
支付寶日志:支付完成
---------
微信日志:開始支付流程
微信風控檢查通過
使用微信處理支付:200.0 元
微信日志:支付完成

1.7 總結

特點描述
抽象工廠統一創建每種支付渠道的組件(處理器、日志器、風控)
策略模式將風控邏輯抽象出來,可替換、可擴展
組合使用每種渠道內部組合策略,不影響外部調用邏輯
易擴展新增一個支付渠道,只需新增實現類和一個工廠

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/908182.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/908182.shtml
英文地址,請注明出處:http://en.pswp.cn/news/908182.shtml

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

相關文章

通過WiFi無線連接小米手機攝像頭到電腦的方法

通過WiFi無線連接小米手機攝像頭到電腦的方法 以下是基于Scrcpy和DroidCam兩種工具的無線連接方案,需提前完成開發者模式與USB調試的開啟(參考原教程步驟): 方法一:Scrcpy無線投屏(無需手機端安裝&#xf…

2025軟件供應鏈安全最佳實踐︱證券DevSecOps下供應鏈與開源治理實踐

項目背景:近年來,云計算、AI人工智能、大數據等信息技術的不斷發展、各行各業的信息電子化的步伐不斷加快、信息化的水平不斷提高,網絡安全的風險不斷累積,金融證券行業面臨著越來越多的威脅挑戰。特別是近年以來,開源…

Java高級 | 【實驗二】Springboot 控制器類+相關注解知識

隸屬文章: Java高級 | (二十二)Java常用類庫-CSDN博客 系列文章: Java高級 | 【實驗一】Spring Boot安裝及測試 最新-CSDN博客 目錄 一、MVC模式 二、SpringBoot基礎——控制層Controller詳解 (一)主要工…

MySQL 事務深度解析:面試核心知識點與實戰

🤟致敬讀者 🟩感謝閱讀🟦笑口常開🟪生日快樂?早點睡覺 📘博主相關 🟧博主信息🟨博客首頁🟫專欄推薦🟥活動信息 文章目錄 Java 中 MySQL 事務深度解析:面試…

【趣味Html】第11課:動態閃爍發光粒子五角星

打造炫酷的動態閃爍發光粒子五角星效果 前言 在現代Web開發中,視覺效果的重要性不言而喻。今天我們將深入探討如何使用HTML5 Canvas和JavaScript創建一個令人驚艷的動態閃爍發光粒子五角星效果。這個項目不僅展示了Canvas的強大功能,還涉及了粒子系統、…

6.RV1126-OPENCV 形態學基礎膨脹及腐蝕

一.膨脹 1.膨脹原理 膨脹的本質就是通過微積分的轉換,將圖像A和圖形B進行卷積操作合并成一個AB圖像。核就是指任意的形狀或者大小的圖形B。例如下圖,將核(也就是圖形B)通過微積分卷積,和圖像A合并成一個圖像AB。 2.特點 圖像就會更加明亮 …

機器學習實戰37-基于情感字典和機器學習的股市輿情分析可視化系統

文章目錄 一、項目背景數字時代情感分析情況二、項目流程1.數據采集與預處理2.復合情感分析模型構建3.輿情分析可視化:三、機器學習算法原理1.支持向量機基礎2.核函數與高維映射3.情感分類特征融合4.模型訓練與優化四、實現代碼五、系統特點與優勢1.復合情感分析模型2.多維度可…

STM32F407VET6學習筆記9:編譯輸出固定大小.bin文件

今日學習如何輸出固定大小的.bin編譯文件 目錄 Keil_V5 fromelf.exe 軟件目錄: 魔棒添加命令輸出bin文件: 輸出固定大小的bin文件: 計算bin文件大小: 安裝 SRecord 工具集: 使用SRecord: 參考文章&#…

【Web應用】若依框架:基礎篇14 源碼閱讀-后端代碼分析

文章目錄 ?前言?一、課程講解?總結 標題詳情作者JosieBook頭銜CSDN博客專家資格、阿里云社區專家博主、軟件設計工程師博客內容開源、框架、軟件工程、全棧(,NET/Java/Python/C)、數據庫、操作系統、大數據、人工智能、工控、網絡、程序人生口號成為你…

Java 單例模式詳解

目錄 1. 餓漢式(Eager Initialization) 2. 懶漢式(Lazy Initialization) 3. 懶漢式 同步鎖(線程安全) 4. 雙重檢查鎖(Double-Checked Locking) 5. 靜態內部類(推薦…

從 AMQP 到 RabbitMQ:核心組件設計與工作原理(一)

一、引言 ** 在當今分布式系統盛行的時代,消息隊列作為一種關鍵的中間件技術,承擔著系統間異步通信、解耦和削峰填谷的重要職責。AMQP(Advanced Message Queuing Protocol)作為一種高級消息隊列協議,為消息隊列的實現…

概率單純形(Probability Simplex)

目錄 定義性質在統計學中的應用在機器學習中的應用在信息論中的應用在優化問題中的應用在其他領域的應用 定義 定義:在數學中,概率單純形(Probability Simplex)是指在 n n n維空間中,所有分量非負且分量之和為1的向量…

項目練習:Vue2中el-button上的@click事件失效

文章目錄 一、問題描述二、解決 一、問題描述 button按鈕上綁定了一個click事件 對應的方法寫在methods中 但是&#xff0c;測試點擊時&#xff0c;無法觸發函數 二、解決 1、問題代碼 <el-buttonclick"changeConfirm(Y)"type"success"plainicon&qu…

十六、【前端強化篇】完善 TestCase 編輯器:支持 API 結構化定義與斷言配置

【前端強化篇】完善 TestCase 編輯器:支持 API 結構化定義與斷言配置 前言準備工作第一步:更新前端 `TestCase` 類型定義第二步:改造 `TestCaseEditView.vue` 表單第三步:修改后端代碼中的TestCase模型和序列化器第四步:測試強化后的用例編輯器總結前言 在之前的后端文章…

HTTP連接管理——短連接,長連接,HTTP 流水線

連接管理是一個 HTTP 的關鍵話題&#xff1a;打開和保持連接在很大程度上影響著網站和 Web 應用程序的性能。在 HTTP/1.x 里有多種模型&#xff1a;短連接、_長連接_和 HTTP 流水線。 下面分別來詳細解釋 短連接 HTTP 協議最初&#xff08;0.9/1.0&#xff09;是個非常簡單的…

MySQL范式和反范式

范式 是用一組規則定義的數據庫設計標準&#xff0c;旨在確保數據庫結構合理&#xff0c;避免數據冗余和異常。 目的 消除數據的重復&#xff0c;提高存儲效率防止數據異常&#xff08;插入、刪除、更新異常&#xff09;提高數據的完整性和一致性 第一范式 定義 所有列&am…

編程技能:格式化打印04,sprintf

專欄導航 本節文章分別屬于《Win32 學習筆記》和《MFC 學習筆記》兩個專欄&#xff0c;故劃分為兩個專欄導航。讀者可以自行選擇前往哪個專欄。 &#xff08;一&#xff09;WIn32 專欄導航 上一篇&#xff1a;編程技能&#xff1a;格式化打印03&#xff0c;printf 回到目錄…

JavaScript性能優化實戰:深入探討JavaScript性能瓶頸與優化技巧

引言:為什么JavaScript性能至關重要 在現代Web開發中,JavaScript已成為構建交互式應用程序的核心技術。隨著單頁應用(SPA)和復雜前端架構的普及,JavaScript代碼的性能直接影響用戶體驗、轉化率甚至搜索引擎排名。研究表明,頁面加載時間每增加1秒,轉化率可能下降7%,而性能…

Java數據結構——八大排序

排序 插?排序希爾排序直接選擇排序堆排序冒泡排序快速排序歸并排序計數排序 排序的概念 排序&#xff1a;就是將一串東西&#xff0c;按照要求進行排序&#xff0c;按照遞增或遞減排序起來 穩定性&#xff1a;就是比如排序中有兩個相同的數&#xff0c;如果排序后&#xff0c…

WPF響應式UI的基礎:INotifyPropertyChanged

INotifyPropertyChanged 1 實現基礎接口2 CallerMemberName優化3 數據更新觸發策略4 高級應用技巧4.1 表達式樹優化4.2 性能優化模式4.3 跨平臺兼容實現 5 常見錯誤排查 在WPF的MVVM架構中&#xff0c; INotifyPropertyChanged是實現數據驅動界面的核心機制。本章將深入解析屬…