設計模式之手寫策略模式實現動態支付(Java實現)

首先,定義一個接口類


import java.util.Map;public interface PayInterface {/*** 支付方法* @param amount 支付金額* @param paymentInfo 支付信息(如卡號、密碼等)* @return 支付結果*/boolean pay(double amount, Map<String, String> paymentInfo);
}

再寫倆個實現類

import java.util.Map;public class Pay1 implements PayInterface {@Overridepublic boolean pay(double amount, Map<String, String> paymentInfo) {System.out.println("使用支付寶支付:" + amount + "元");// 實際支付寶支付邏輯...// 驗證支付信息// 調用支付寶API// 處理支付結果return true; // 假設支付成功}
}
import java.util.Map;public class Pay2 implements PayInterface {@Overridepublic boolean pay(double amount, Map<String, String> paymentInfo) {System.out.println("使用微信支付:" + amount + "元");// 實際微信支付邏輯...// 驗證支付信息// 調用微信支付API// 處理支付結果return true; // 假設支付成功}
}

此時就把支付邏輯的類寫完了。

再封裝一個上下文信息的類。

import java.util.Map;/*** 支付上下文*/
class PaymentContext {private PayInterface paymentStrategy;public PaymentContext(PayInterface paymentStrategy) {this.paymentStrategy = paymentStrategy;}public void setPaymentStrategy(PayInterface paymentStrategy) {this.paymentStrategy = paymentStrategy;}public boolean executePayment(double amount, Map<String, String> paymentInfo) {return paymentStrategy.pay(amount, paymentInfo);}
}

以及一個生成支付實例的工廠類

public class PayFactory {public static PayInterface getStrategy(String paymentType) {switch (paymentType.toLowerCase()) {case "alipay":return new Pay1();case "wechat":return new Pay2();default:throw new IllegalArgumentException("不支持的支付方式: " + paymentType);}}
}

此時準備工作完成了。

import java.util.HashMap;
import java.util.Map;public class Main {public static void main(String[] args) {// 準備支付信息Map<String, String> paymentInfo = new HashMap<>();paymentInfo.put("account", "user123");paymentInfo.put("password", "123456");paymentInfo.put("cardNumber", "622588******1234"); // 銀行卡支付需要// 創建支付上下文PaymentContext context = new PaymentContext(PayFactory.getStrategy("wechat"));// 使用支付寶支付boolean result1 = context.executePayment(100.0, paymentInfo);System.out.println("支付寶支付結果: " + (result1 ? "成功" : "失敗"));// 動態切換到微信支付context.setPaymentStrategy(PayFactory.getStrategy("alipay"));boolean result2 = context.executePayment(200.0, paymentInfo);System.out.println("微信支付結果: " + (result2 ? "成功" : "失敗"));//添加銀行卡支付方式,可以通過動態代理的方式進行實現,不展開介紹可以看看proxy包的實現}
}

此時就完成了 一個支付模塊的設計,能夠支持動態選擇支付方式,而不是大量的ifelse操作,

但是以上還有很多增加的點,

比如工廠類的寫法有待改進,上面只是簡單寫法,還有如果需要動態的創建新的支付方式呢,難道只能停止運行創建完再手動運行嗎?這樣太麻煩了,我們可以使用動態代理的方式在運行期進行創建支付方式,怎么創建呢?

需要有一定的動態代理基礎,我們寫一個接口,能夠生成統一模板的支付類,并將其編譯加載到JVM中,然后驗證其正確性和穩定性,最后將其注冊到工廠類中即可供用戶使用。

深入理解Java的動態代理機制,手寫一個簡易的動態代理-CSDN博客

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

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

相關文章

Spring Boot 虛擬線程 vs WebFlux:誰更勝一籌?

Spring Boot 作為構建現代 Java 應用程序的強大框架,為開發者提供了多種處理并發和可擴展性的解決方案。其中最受關注的兩種方案是 Spring Boot 虛擬線程(Java 21 引入)和 Spring Boot WebFlux(基于響應式編程)。雖然兩者都致力于優化資源利用率和提升高并發處理能力,但在…

淘寶商品搜索接口|關鍵字獲取商品列表API接入指南

在電商領域&#xff0c;淘寶作為中國最大的電子商務平臺之一&#xff0c;擁有海量的商品資源。對于開發者而言&#xff0c;通過淘寶開放平臺提供的 API 接口&#xff0c;能夠實現與淘寶平臺的深度整合&#xff0c;其中關鍵字搜索商品 API 接口尤為重要。它允許開發者根據特定的…

Centos 離線部署(MQTT)EMOX腳本并設置開機自啟

文件結構 install_emqx.sh #!/bin/bash # Filename: install_emqx.sh # Description: EMQX離線一鍵部署腳本 (針對特殊目錄結構)# 檢查root權限 if [[ $EUID -ne 0 ]]; thenecho "請使用root權限運行此腳本&#xff01;" exit 1 fi# 定義依賴包和安裝路徑 DEP_RPM&…

機器學習基礎:從概念到應用的全面解析

&#x1f9d1; 博主簡介&#xff1a;CSDN博客專家、CSDN平臺優質創作者&#xff0c;高級開發工程師&#xff0c;數學專業&#xff0c;10年以上C/C, C#, Java等多種編程語言開發經驗&#xff0c;擁有高級工程師證書&#xff1b;擅長C/C、C#等開發語言&#xff0c;熟悉Java常用開…

【機器學習1】線性回歸與邏輯回歸

?邏輯回歸與線性回歸的主要區別在于理論基礎、應用場景和數學模型。 1 線性回歸 1.1 理論基礎 線性回歸主要用于建模自變量與連續性因變量之間關系的統計方法&#xff0c;試圖利用一條線來擬合自變量與因變量之間的線性關系。 1.2 應用場景 從應用場景來說&#xff0c;適…

小程序 頂部欄標題欄 下拉滾動 漸顯白色背景

![在這里插入圖片描述](https://i-blog.csdnimg.cn/direct/3164fd0e6d6848efaa1e87e02c35179e.png 下拉 100px 后 變成漸變成白色 顯示原理 <wd-navbar fixed safeAreaInsetTop :bordered"false":custom-style"background-color: rgba(255, 255, 255, op…

Java底層原理:深入理解類加載機制與反射

一、Java類加載機制 Java類加載機制是Java運行時環境的重要組成部分&#xff0c;它負責將字節碼文件加載到JVM內存中&#xff0c;并將其轉換為可執行的類。類加載機制的實現涉及類加載器&#xff08;ClassLoader&#xff09;、類加載過程和類加載器的層次結構。 &#xff08;…

Android 中查看數據庫內容方式

一、背景 創建的db數據庫&#xff0c;有時候需要查看數據庫中的數據內容,或者查看數據是否有更新到數據等等。這時候就需要查看數據庫的內容。 二、數據庫路徑 博主用的是第三方的greendao數據庫框架,生成的.db文件路徑如下:(路徑僅供參考) /data/data/app_package/database…

unity實現浮動組件

目錄 前言方法后言組件代碼 前言 在unity中&#xff0c;要讓一個物體變得讓人感到輕飄飄的&#xff0c;就可以給一個物體添加上浮動組件。今天我們就來實現它。 方法 我們先來看一下 sin ? \sin sin函數的曲線。 在這條曲線上&#xff0c;隨著 x x x向右移動&#xff0c; y…

Cisco Nexus93240接口帶寬顯示異常高故障- bug

hardware: cisco N93240 software: 9.3(10) 1個萬兆接口&#xff0c;顯示的rate超出幾萬倍 開case查詢&#xff0c;告知是bug&#xff0c;需要版本升級解決。

pyhton基礎【15】函數進階一

目錄 一. 函數進階 1. 默認參數&#xff1a; 2. 關鍵字參數&#xff1a; 3. 可變參數&#xff1a; 4. 裝飾器&#xff1a; 5. 匿名函數lambda&#xff1a; 6. 高階函數&#xff1a; 7. 遞歸函數&#xff1a; 8. 類型注解&#xff1a; 二.函數參數的高級使用 缺…

【軟考高級系統架構論文】論企業應用系統的數據持久層架構設計

論文真題 數據持久層 (Data Persistence Layer) 通常位于企業應用系統的業務邏輯層和數據源層之間,為整個項目提供一個高層、統一、安全、并發的數據持久機制,完成對各種數據進行持久化的編程工作,并為系統業務邏輯層提供服務。它能夠使程序員避免手工編寫訪問數據源的方法…

ubuntu使用 Conda 安裝 pyseer詳細教程

pyseer 是一個用于 微生物全基因組關聯分析(GWAS) 的生物信息學工具。它可以幫助研究者識別微生物(如細菌)中與表型(如耐藥性、毒力、致病性)相關的遺傳變異。 一、安裝mamba conda install -n base -c conda-forge mamba二、創建虛擬環境 conda create -n pyseer-env …

Redis04

redis 一、redis的作用和使用場景 redis是一個內存級的高速緩存數據庫。&#xff08;對比磁盤IO&#xff09; 使用場景&#xff1a;1、并發訪問量大的 2、數據量小 3、修改不頻繁 項目中&#xff1a;1、驗證碼 2、登錄成功用戶信息 3、首頁&#xff08;模塊數據 輪播圖&…

計算機網絡學習筆記:TCP可靠傳輸實現、超時重傳時間選擇

文章目錄 一、TCP可靠傳輸實現二、TCP超時重傳時間選擇 一、TCP可靠傳輸實現 TCP可靠傳輸的實現&#xff0c;主要基于發送方和接收方的滑動窗口&#xff0c;以及確認機制&#xff1a; 發送方在未收到確認&#xff08;ACK&#xff09;前&#xff0c;可以將序號落在發送窗口內的…

Perl 正則表達式

Perl 正則表達式 引言 Perl 正則表達式&#xff08;Regular Expressions&#xff09;是Perl編程語言中一個強大且靈活的工具&#xff0c;用于字符串處理和模式匹配。正則表達式在文本處理、數據驗證、搜索和替換等任務中發揮著至關重要的作用。本文將深入探討Perl正則表達式的…

Security: RSA: 1024 bit 長度已經變得不安全了

文章目錄 參考推薦限制RHEL相關配置man crypto-policies包含的應用使用方法是配置文件include參考 https://csrc.nist.gov/pubs/sp/800/57/pt1/r2/final https://www.linuxquestions.org/questions/linux-security-4/1024-bit-dsa-vs-2048-bit-rsa-4175439131/ https://csrc.n…

第一課:大白話中的機器學習

各位看官好啊!今天咱們來聊一個聽起來高大上但實際上特別接地氣的玩意兒——機器學習。別被這名字嚇到,它其實就是教電腦像人類一樣學習知識的一套方法。想象一下你教你家狗子坐下、握手的過程,機器學習差不多就是這么回事,只不過"學生"換成了電腦。 一、啥是機…

實現 el-table 中鍵盤方向鍵導航功能vue2+vue3(類似 Excel)

實現 el-table 中鍵盤方向鍵導航功能vue2vue3&#xff08;類似 Excel&#xff09; 功能需求 在 Element UI 的 el-table 表格中實現以下功能&#xff1a; 使用鍵盤上下左右鍵在可編輯的 el-input/el-select 之間移動焦點焦點移動時自動定位到對應單元格支持光標位置自動調整…

MyBatis:從入門到進階

&#x1f4cc; 摘要 在 Java 后端開發中&#xff0c;MyBatis 是一個非常流行且靈活的持久層框架。它不像 Hibernate 那樣完全封裝 SQL&#xff0c;而是提供了對 SQL 的精細控制能力&#xff0c;同時又具備 ORM&#xff08;對象關系映射&#xff09;的功能。 本文將帶你從 MyB…