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

一、支付成功后事件驱动

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("没有对应的订单支付策略");
    }


}
相关推荐
Auc244 小时前
OJ判题系统第6期之判题逻辑开发——设计思路、实现步骤、代码实现(策略模式)
java·开发语言·docker·容器·策略模式
yangyang_z3 天前
【C++设计模式之Strategy策略模式】
c++·设计模式·策略模式
YoseZang4 天前
【设计模式】GoF设计模式之策略模式(Strategy Pattern)
设计模式·策略模式
世纪摆渡人4 天前
设计模式-策略模式(Strategy Pattern)
设计模式·策略模式
不爱吃萝卜的嘤嘤怪4 天前
如何删除vscod远程连接的服务器
运维·服务器·策略模式
ValidationExpression5 天前
设计模式-策略模式
python·设计模式·策略模式
文件夹__iOS7 天前
状态模式 VS 策略模式
状态模式·策略模式
深海小咸鱼8 天前
如何在服务器后台运行Python脚本,并配置虚拟环境与GPU支持
服务器·python·策略模式
钢铁男儿9 天前
Python 装饰器优化策略模式:电商促销折扣的优雅解法
开发语言·python·策略模式