支付系统设计模式总结:策略模式与工厂模式的结合

在支付系统中,为了支持多种支付方式(如支付宝、微信支付等),并保证代码的可扩展性和维护性,通常会使用策略模式工厂模式。这两种设计模式可以很好地结合起来,以实现灵活的支付处理逻辑。

设计模式简介

  • 策略模式(Strategy Pattern):定义一系列算法,并将每个算法封装起来,使它们可以互换。策略模式让算法独立于使用它的客户端而变化。

  • 工厂模式(Factory Pattern):提供一个创建对象的接口,由子类决定实例化哪一个类。工厂模式使得类的实例化推迟到子类。

现有代码结构分析

1. 策略接口 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 ""; }
}

2. 策略实现类

微信支付策略 WechatPayStrategy
@Service
@Slf4j
public class WechatPayStrategy implements PayStrategy {
    // 实现具体支付逻辑
}

支付宝支付策略 AliPayStrategy
@Service
@Slf4j
public class AliPayStrategy implements PayStrategy {
    // 实现具体支付逻辑
}

3. 工厂类 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 "";
    }
}

4. 上下文类 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);
    }
}

策略模式与工厂模式的结合

  1. 策略模式用于定义不同的支付方式(如支付宝、微信支付等),并将每种支付方式的具体实现封装在各自的策略类中。

  2. 工厂模式通过PayFactory类来根据传入的支付类型选择合适的策略类,并创建相应的上下文对象PayStrategyContext来执行具体的支付操作。

这种结合方式使得新增支付通道变得非常容易,只需添加新的策略类,并在工厂类中注册即可。

新增支付通道(如PayPal)

假设我们需要新增一个支付通道PayPal,以下是需要修改的代码:

1. 创建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";
    }
}

2. 修改工厂类 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 "";
    }
}

3. 更新枚举类 ProductOrderPayTypeEnum

确保支付类型枚举中包含新的支付方式:

public enum ProductOrderPayTypeEnum {
    ALI_PAY, WECHAT_PAY, PAYPAL // 新增PAYPAL
}

4. 更新配置文件(如有必要)

如果PayPal需要特定的配置项(如API密钥等),可以在application.yml中添加相应的配置。

pay:
  paypal:
    client-id: your-client-id
    secret: your-secret
    callback-url: http://your-callback-url

通过结合策略模式工厂模式,支付系统的代码结构变得更加清晰和易于扩展。新增支付通道时,只需遵循上述步骤,创建新的策略类并在工厂类中进行简单的修改,即可轻松集成新的支付方式。这种方式不仅提高了代码的可维护性,还增强了系统的灵活性和扩展性。

你可能感兴趣的:(spring,boot,后端,策略模式,设计模式)