策略模式(Strategy Pattern):定义一系列算法,并将每个算法封装起来,使它们可以互换。策略模式让算法独立于使用它的客户端而变化。
工厂模式(Factory Pattern):提供一个创建对象的接口,由子类决定实例化哪一个类。工厂模式使得类的实例化推迟到子类。
PayStrategy
public interface PayStrategy {
String unifiedOrder(PayInfoVO payInfoVO);
default String refund(PayInfoVO payInfoVO) { return ""; }
default String queryPayStatus(PayInfoVO payInfoVO) { return ""; }
default String closeOrder(PayInfoVO payInfoVO) { return ""; }
}
WechatPayStrategy
@Service
@Slf4j
public class WechatPayStrategy implements PayStrategy {
// 实现具体支付逻辑
}
AliPayStrategy
@Service
@Slf4j
public class AliPayStrategy implements PayStrategy {
// 实现具体支付逻辑
}
PayFactory
@Component
@Slf4j
public class PayFactory {
@Autowired
private AliPayStrategy aliPayStrategy;
@Autowired
private WechatPayStrategy wechatPayStrategy;
public String pay(PayInfoVO payInfoVO){
String payType = payInfoVO.getPayType();
if (ProductOrderPayTypeEnum.ALI_PAY.name().equals(payType)) {
PayStrategyContext payStrategyContext = new PayStrategyContext(aliPayStrategy);
return payStrategyContext.executeUnifiedOrder(payInfoVO);
} else if(ProductOrderPayTypeEnum.WECHAT_PAY.name().equals(payType)){
PayStrategyContext payStrategyContext = new PayStrategyContext(wechatPayStrategy);
return payStrategyContext.executeUnifiedOrder(payInfoVO);
}
return "";
}
}
PayStrategyContext
public class PayStrategyContext {
private PayStrategy payStrategy;
public PayStrategyContext(PayStrategy payStrategy){
this.payStrategy = payStrategy;
}
public String executeUnifiedOrder(PayInfoVO payInfoVO){
return payStrategy.unifiedOrder(payInfoVO);
}
public String executeRefund(PayInfoVO payInfoVO){
return payStrategy.refund(payInfoVO);
}
public String executeCloseOrder(PayInfoVO payInfoVO){
return payStrategy.closeOrder(payInfoVO);
}
public String executeQueryPayStatus(PayInfoVO payInfoVO){
return payStrategy.queryPayStatus(payInfoVO);
}
}
策略模式用于定义不同的支付方式(如支付宝、微信支付等),并将每种支付方式的具体实现封装在各自的策略类中。
工厂模式通过PayFactory
类来根据传入的支付类型选择合适的策略类,并创建相应的上下文对象PayStrategyContext
来执行具体的支付操作。
这种结合方式使得新增支付通道变得非常容易,只需添加新的策略类,并在工厂类中注册即可。
假设我们需要新增一个支付通道PayPal,以下是需要修改的代码:
@Service
@Slf4j
public class PayPalStrategy implements PayStrategy {
@Override
public String unifiedOrder(PayInfoVO payInfoVO) {
// 实现PayPal下单逻辑
return "PayPal Order Created";
}
@Override
public String refund(PayInfoVO payInfoVO) {
// 实现PayPal退款逻辑
return "PayPal Refund Success";
}
@Override
public String queryPayStatus(PayInfoVO payInfoVO) {
// 实现PayPal查询支付状态逻辑
return "PayPal Payment Status";
}
@Override
public String closeOrder(PayInfoVO payInfoVO) {
// 实现PayPal关闭订单逻辑
return "PayPal Order Closed";
}
}
PayFactory
@Component
@Slf4j
public class PayFactory {
@Autowired
private AliPayStrategy aliPayStrategy;
@Autowired
private WechatPayStrategy wechatPayStrategy;
@Autowired
private PayPalStrategy payPalStrategy; // 新增PayPal策略
public String pay(PayInfoVO payInfoVO){
String payType = payInfoVO.getPayType();
if (ProductOrderPayTypeEnum.ALI_PAY.name().equals(payType)) {
PayStrategyContext payStrategyContext = new PayStrategyContext(aliPayStrategy);
return payStrategyContext.executeUnifiedOrder(payInfoVO);
} else if(ProductOrderPayTypeEnum.WECHAT_PAY.name().equals(payType)){
PayStrategyContext payStrategyContext = new PayStrategyContext(wechatPayStrategy);
return payStrategyContext.executeUnifiedOrder(payInfoVO);
} else if("PAYPAL".equalsIgnoreCase(payType)){ // 新增PayPal支付判断
PayStrategyContext payStrategyContext = new PayStrategyContext(payPalStrategy);
return payStrategyContext.executeUnifiedOrder(payInfoVO);
}
return "";
}
}
ProductOrderPayTypeEnum
确保支付类型枚举中包含新的支付方式:
public enum ProductOrderPayTypeEnum {
ALI_PAY, WECHAT_PAY, PAYPAL // 新增PAYPAL
}
如果PayPal需要特定的配置项(如API密钥等),可以在application.yml
中添加相应的配置。
pay:
paypal:
client-id: your-client-id
secret: your-secret
callback-url: http://your-callback-url
通过结合策略模式和工厂模式,支付系统的代码结构变得更加清晰和易于扩展。新增支付通道时,只需遵循上述步骤,创建新的策略类并在工厂类中进行简单的修改,即可轻松集成新的支付方式。这种方式不仅提高了代码的可维护性,还增强了系统的灵活性和扩展性。