SpringBoot如何優(yōu)雅切換支付渠道
前言
項目開發(fā)中,我們經(jīng)常需要根據(jù)不同條件動態(tài)選擇服務實現(xiàn),例如根據(jù)支付類型選擇不同的支付處理器,或根據(jù)數(shù)據(jù)源類型選擇不同的數(shù)據(jù)訪問策略。
實現(xiàn)
基于策略模式的實現(xiàn)方案
策略模式的核心在于將不同的算法或行為封裝成獨立的策略類,使得它們可以相互替換,從而提高系統(tǒng)的靈活性和可維護性。
定義支付處理器接口
// 支付處理器接口
public interface PaymentProcessor {
String processPayment(double amount);
}實現(xiàn)具體支付處理器策略類
// 支付寶支付處理器
@Component
public class AlipayProcessor implements PaymentProcessor {
@Override
public String processPayment(double amount) {
return"處理支付寶支付: " + amount;
}
}
// 微信支付處理器
@Component
public class WechatPayProcessor implements PaymentProcessor {
@Override
public String processPayment(double amount) {
return"處理微信支付: " + amount;
}
}
// 銀行卡支付處理器
@Component
public class BankCardProcessor implements PaymentProcessor {
@Override
public String processPayment(double amount) {
return"處理銀行卡支付: " + amount;
}
}定義支付策略上下文類
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Map;
@Component
public class PaymentContext {
private final Map<String, PaymentProcessor> paymentProcessorMap;
@Autowired
public PaymentContext(Map<String, PaymentProcessor> paymentProcessorMap) {
this.paymentProcessorMap = paymentProcessorMap;
}
public String processPayment(String paymentType, double amount) {
PaymentProcessor processor = paymentProcessorMap.get(paymentType);
if (processor != null) {
return processor.processPayment(amount);
}
return"未找到對應的支付處理器: " + paymentType;
}
}
PaymentContext類作為策略模式中的上下文,通過構造函數(shù)注入包含所有支付處理器的Map,并根據(jù)支付類型選擇相應的處理器執(zhí)行支付處理,起到管理和調(diào)度策略的作用。
定義支付服務類和控制器類
// 支付服務類
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class PaymentService {
private final PaymentContext paymentContext;
@Autowired
public PaymentService(PaymentContext paymentContext) {
this.paymentContext = paymentContext;
}
public String handlePayment(String paymentType, double amount) {
return paymentContext.processPayment(paymentType, amount);
}
}
// 支付控制器類
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/payment")
public class PaymentController {
private final PaymentService paymentService;
@Autowired
public PaymentController(PaymentService paymentService) {
this.paymentService = paymentService;
}
@PostMapping("/process")
public String processPayment(@RequestParam String paymentType, @RequestParam double amount) {
return paymentService.handlePayment(paymentType, amount);
}
}基于 Map 注入的實現(xiàn)方案
基于Map注入的方式借助Spring的依賴注入機制,將接口的所有實現(xiàn)類以鍵值對形式注入到Map中,實現(xiàn)根據(jù)鍵值快速獲取對應實現(xiàn)類實例。
定義支付處理器接口和實現(xiàn)類
與策略模式中的定義相同,保持PaymentProcessor接口和支付寶、微信、銀行卡等支付處理器實現(xiàn)類,通過@Component注解將實現(xiàn)類注冊到Spring容器中。
改造支付服務類
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Map;
@Service
public class PaymentService {
private final Map<String, PaymentProcessor> paymentProcessorMap;
@Autowired
public PaymentService(Map<String, PaymentProcessor> paymentProcessorMap) {
this.paymentProcessorMap = paymentProcessorMap;
}
public void processPayment(String paymentType, double amount) {
PaymentProcessor processor = paymentProcessorMap.get(paymentType);
if (processor != null) {
processor.processPayment(amount);
} else {
System.out.println("未找到對應的支付處理器: " + paymentType);
}
}
}?支付服務類通過構造函數(shù)注入
Map<String, PaymentProcessor>,在處理支付請求時,直接根據(jù)支付類型從Map中獲取對應的處理器實例并執(zhí)行支付操作。
使用支付服務
同樣定義控制器類接收支付請求,調(diào)用PaymentService的方法完成支付處理,與策略模式中的控制器實現(xiàn)類似。
差異對比
- 管理方式
a.策略模式:通過上下文類明確管理策略對象,各個策略類職責清晰,系統(tǒng)結構更有條理,便于維護和擴展新策略。
b.基于 Map:依賴 Spring 容器注入Map,元素管理較為松散,缺乏專門的管理角色,在復雜場景下可能導致代碼邏輯不夠清晰。
- 查找邏輯
- 策略模式:上下文類可根據(jù)多種復雜條件選擇策略,如用戶信息、業(yè)務規(guī)則等,適應復雜業(yè)務場景。
- 基于 Map:主要依賴Map的get方法,根據(jù)單一鍵值查找,適合簡單的標識符匹配場景,復雜查找邏輯實現(xiàn)較困難。
- 適用場景
- 策略模式:適用于算法或行為多變、需要靈活切換,以及業(yè)務規(guī)則復雜、需多種條件組合選擇實現(xiàn)的場景。
- 基于 Map:適合服務或?qū)崿F(xiàn)類數(shù)量穩(wěn)定、查找邏輯簡單,主要依據(jù)單一標識符選擇的場景。



































