基于事件驱动和策略模式的差异化处理方案

发布于:2025-05-14 ⋅ 阅读:(9) ⋅ 点赞:(0)

一、支付成功后事件驱动

        1、支付成功事件

/**
 * 支付成功事件
 *
 * @author ronshi
 * @date 2025/5/12 14:40
 */
@Getter
@Setter
public class PaymentSuccessEvent extends ApplicationEvent {
    private static final long serialVersionUID = 1L;

    private ProductOrderDO productOrderDO;

    public PaymentSuccessEvent(Object source, ProductOrderDO productOrderDO) {
        super(source);
        this.productOrderDO = productOrderDO;
    }
}

        2、事件触发入口

@Autowired
private ApplicationEventPublisher eventPublisher;

public Boolean handlePaymentResult(HandlePaymentResultCmd cmd) {
        //其他业务逻辑处理
        
        //发布领域事件(解耦后续处理)
        eventPublisher.publishEvent(new PaymentSuccessEvent(this, productOrderDO));
        return true;
    }

         3、事件监听器 

/**
 * 支付成功事件监听器
 *
 * @author ronshi
 * @date 2025/5/12 15:20
 */
@RequiredArgsConstructor
@Component
public class PaymentSuccessEventHandler {
    private final PaymentSuccessStrategyFactory orderPaymentStrategyFactory;

    /**
     * 处理支付成功事件
     *
     * @param event 支付成功事件
     */
    @EventListener
    public void handleEvent(PaymentSuccessEvent event) {
        System.out.println("【处理支付成功事件】:" + event.getProductOrderDO().getId());
        IPaymentSuccessStrategy strategy = orderPaymentStrategyFactory.getStrategy(event.getProductOrderDO().getOrderType());
        strategy.execute(event.getProductOrderDO());
    }
}

二、不同订单类型的策略模式处理

         1、订单支付策略

/**
 * 订单支付策略
 *
 * @author ronshi
 * @date 2025/5/12 14:58
 */
public interface IPaymentSuccessStrategy {

    /**
     * 执行方法
     *
     * @param productOrderDO 订单信息
     */
    void execute(ProductOrderDO productOrderDO);

    /**
     * 获取该策略支持的订单类型
     *
     * @return 订单类型
     */
    String getSupportedOrderType();
}

         2、新购订单支付策略

/**
 * 新购订单支付策略
 *
 * @author ronshi
 * @date 2025/5/12 15:51
 */
@Component
public class PurchasePaymentSuccessStrategy implements IPaymentSuccessStrategy {
    /**
     * 执行方法
     *
     * @param productOrderDO 订单信息
     */
    @Override
    public void execute(ProductOrderDO productOrderDO) {
        System.out.println("【新购订单支付策略】:" + productOrderDO.getId());
    }

    /**
     * 获取该策略支持的订单类型
     *
     * @return 订单类型
     */
    @Override
    public String getSupportedOrderType() {
        return OrderTypeEnum.PURCHASE.getCode();
    }
}

         3、续费订单支付策略

/**
 * 续费订单支付策略
 *
 * @author ronshi
 * @date 2025/5/12 15:53
 */
@Component
public class RenewPaymentSuccessStrategy implements IPaymentSuccessStrategy {
    /**
     * 执行方法
     *
     * @param productOrderDO 订单信息
     */
    @Override
    public void execute(ProductOrderDO productOrderDO) {
        System.out.println("【续费订单支付策略】:" + productOrderDO.getId());
    }

    /**
     * 获取该策略支持的订单类型
     *
     * @return 订单类型
     */
    @Override
    public String getSupportedOrderType() {
        return OrderTypeEnum.RENEW.getCode();
    }
}

           4、订单支付策略工厂

/**
 * 订单支付策略工厂
 *
 * @author ronshi
 * @date 2025/5/12 15:56
 */
@RequiredArgsConstructor
@Component
public class PaymentSuccessStrategyFactory {
    private final Map<String, IPaymentSuccessStrategy> strategyMap;

    /**
     * 获取订单支付策略
     *
     * @param orderType 订单类型
     * @return 订单支付策略
     */
    public IPaymentSuccessStrategy getStrategy(String orderType) {
        for (IPaymentSuccessStrategy strategy : strategyMap.values()) {
            if (strategy.getSupportedOrderType().equals(orderType)) {
                return strategy;
            }
        }
        throw new BusinessServiceException("没有对应的订单支付策略");
    }


}


网站公告

今日签到

点亮在社区的每一天
去签到