SpringBoot整合「策略模式」+「工厂模式」搭建高效支付服务
原创 爱他就关注他---> Java分享客栈 2023-09-17 12:26 发表于湖北
收录于合集
#java66个
#支付1个
#springboot27个
#策略模式1个
#工厂模式1个
点击关注公众号,Java干货及时送达👇

Java分享客栈
分享IT互联网主流技术,包括Java、SpringBoot、SpringCloud-alibaba、Redis缓存、MQ队列、网络编程、websocket通信、netty、docker、k8s等技术及多年工作经验分享和感悟。
67篇原创内容
公众号

前言
很多互联网公司会接入支付功能,微信支付、支付宝支付、银联支付等等,会有各种不同的渠道。
搭建支付服务时,我们往往会采用
策略模式+工厂模式来实现。
接下来,我用一段伪代码,将这种方式展示出来,让大家一次理解。
正文
1、策略接口
定义一个策略接口,包含支付的常用方法。
java
import java.math.BigDecimal;
public interface PaymentStrategy {
// 创建支付订单
String createOrder(BigDecimal amount);
// 查询支付结果
String queryResult(String orderId);
}
2、支付策略实现类
创建不同渠道的支付策略类,实现前面定义的策略接口。
java
@Service
public class AlipayStrategy implements PaymentStrategy {
@Override
public String createOrder(BigDecimal amount) {
// 调用支付宝创建订单接口的具体实现
String orderId = "alipay_order_12345"; // 这里假设返回的订单ID
System.out.println("调用支付宝创建订单接口,支付金额:" + amount.toString());
return orderId;
}
@Override
public String queryResult(String orderId) {
// 调用支付宝查询订单结果接口的具体实现
System.out.println("调用支付宝查询订单结果接口,订单ID:" + orderId);
return "Paid";
}
}
@Service
public class WeChatPayStrategy implements PaymentStrategy {
@Override
public String createOrder(BigDecimal amount) {
// 调用微信支付创建订单接口的具体实现
String orderId = "wechatpay_order_67890"; // 这里假设返回的订单ID
System.out.println("调用微信支付创建订单接口,支付金额:" + amount.toString());
return orderId;
}
@Override
public String queryResult(String orderId) {
// 调用微信支付查询订单结果接口的具体实现
System.out.println("调用微信支付查询订单结果接口,订单ID:" + orderId);
return "Success";
}
}
3、支付工厂类
工厂类,根据前端传入的不同渠道,获取不同的支付类。
java
@Component
public class PaymentStrategyFactory {
private final ApplicationContext applicationContext;
@Autowired
public PaymentStrategyFactory(ApplicationContext applicationContext) {
this.applicationContext = applicationContext;
}
public PaymentStrategy getPaymentStrategy(String paymentChannel) {
switch (paymentChannel) {
case "alipay":
return applicationContext.getBean(AlipayStrategy.class);
case "wechatpay":
return applicationContext.getBean(WeChatPayStrategy.class);
default:
throw new IllegalArgumentException("Invalid payment channel.");
}
}
}
4、支付服务类
通过前端传入的渠道channel,通过工厂获取到对应的支付实现类,然后调用支付方法即可。
java
@Service
public class PaymentService {
private final PaymentStrategyFactory paymentStrategyFactory;
@Autowired
public PaymentService(PaymentStrategyFactory paymentStrategyFactory) {
this.paymentStrategyFactory = paymentStrategyFactory;
}
/**
* 创建支付订单
*
* @param paymentChannel 支付渠道
* @param amount 支付金额
* @return 订单ID
*/
public String createOrder(String paymentChannel, BigDecimal amount) {
PaymentStrategy paymentStrategy = paymentStrategyFactory.getPaymentStrategy(paymentChannel);
if (paymentStrategy != null) {
return paymentStrategy.createOrder(amount);
} else {
throw new IllegalArgumentException("Invalid payment channel.");
}
}
/**
* 查询支付结果
*
* @param paymentChannel 支付渠道
* @param orderId 订单ID
* @return 支付结果
*/
public String queryResult(String paymentChannel, String orderId) {
PaymentStrategy paymentStrategy = paymentStrategyFactory.getPaymentStrategy(paymentChannel);
if (paymentStrategy != null) {
return paymentStrategy.queryResult(orderId);
} else {
throw new IllegalArgumentException("Invalid payment channel.");
}
}
}
5、调用方式
控制器中,就是根据前端传入的渠道来调用不同的支付实现。
java
@RestController
public class PaymentController {
private final PaymentService paymentService;
@Autowired
public PaymentController(PaymentService paymentService) {
this.paymentService = paymentService;
}
/**
* 创建支付订单API
*
* @param paymentChannel 支付渠道
* @param amount 支付金额
* @return 创建订单结果
*/
@GetMapping("/create-order/{paymentChannel}/{amount}")
public String createOrder(@PathVariable String paymentChannel, @PathVariable String amount) {
try {
BigDecimal paymentAmount = new BigDecimal(amount);
String orderId = paymentService.createOrder(paymentChannel, paymentAmount);
return "Order created successfully. Order ID: " + orderId;
} catch (IllegalArgumentException | NumberFormatException e) {
return "Error: " + e.getMessage();
}
}
/**
* 查询支付结果API
*
* @param paymentChannel 支付渠道
* @param orderId 订单ID
* @return 查询支付结果
*/
@GetMapping("/query-result/{paymentChannel}/{orderId}")
public String queryResult(@PathVariable String paymentChannel, @PathVariable String orderId) {
try {
return paymentService.queryResult(paymentChannel, orderId);
} catch (IllegalArgumentException e) {
return "Error: " + e.getMessage();
}
}
}
总结
以上只是核心实现的伪代码,理解了设计模式的使用方式后,剩下的就可以自行扩展了。
今天的小知识,你学会了吗?

![]()
关注公众号,回复关键词【面试】,或选择 菜单 - 学习资源 - 面试题,都可获取精心收集的Java面试题。
包含:【Java面试八股文10万字总结】【Java进阶架构核心手册】
后续会不断收集更多资源及干货放在里面

你的点赞+在看,是我持续分享干货的动力哦!
更多推荐

所有评论(0)