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

一、支付成功后事件驱动

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


}
相关推荐
zhangfeng11331 天前
com.apple.quarantine 并不是乱码,而是 macOS Gatekeeper 给下载文件自动打上的“隔离属性
macos·策略模式
lpfasd1233 天前
Ollama 还是 LM Studio:在 24GB 的 M6 Mac 上,我把 Ollama 卸载了
macos·策略模式
福大大架构师每日一题5 天前
ollama v0.40.11发布:macOS原生语音生成上线,d3决策模型正式加入
macos·策略模式
AIex-YH8 天前
发酵罐里点一盏灯:光发酵,正在重算微藻蛋白的成本账
运维·制造·策略模式
snakecy8 天前
macOS 安装 LaTeX 全流程指南:从 MacTeX 到中文排版
macos·策略模式
钱栈up13 天前
从 macOS 切回 Windows,我用 5 个免费工具把 80% 操作习惯搬了回来
windows·macos·策略模式
kunicoding15 天前
C++ 策略模式实战:写一个可以“一键换输出“的日志系统
开发语言·c++·策略模式
峥嵘life16 天前
Android16 开机后立即打开相机闪退问题分析与解决总结
android·开发语言·数码相机·策略模式
智慧城市203017 天前
关键供应商连续交付不合格批次,说明质量风险可能持续存在。企业需要建立“批次隔离、加严检验、驻厂遏制、复检放行、供应商升级”的处置闭环,同时统筹保供。
数据分析·策略模式·战略咨询·流程管理
happy_baymax18 天前
Dell G3 3590 黑苹果实战:OpenCore 1.0.8 + NullMoth 驱动让 GTX 1660 跑起 Metal
策略模式