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

一、支付成功后事件驱动

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


}
相关推荐
牛奶咖啡139 小时前
学习设计模式《十六》——策略模式
学习·设计模式·策略模式·认识策略模式·策略模式的优缺点·何时选用策略模式·策略模式的使用示例
勤奋的知更鸟12 小时前
Java 编程之策略模式详解
java·设计模式·策略模式
FreeBuf_13 小时前
朝鲜APT组织使用Nim语言恶意软件对macOS发起隐秘Web3与加密货币攻击
macos·web3·策略模式
暮乘白帝过重山13 小时前
设计模式篇:灵活多变的策略模式
设计模式·策略模式
GodKeyNet13 小时前
设计模式-策略模式
设计模式·策略模式
守城小轩10 天前
Chromium 136 编译指南 macOS篇:编译优化技巧(六)
macos·策略模式
尤物程序猿11 天前
设计模式之手写策略模式实现动态支付(Java实现)
java·设计模式·策略模式
守城小轩15 天前
Chromium 136 编译指南 macOS篇:Xcode安装与配置(二)
macos·xcode·策略模式
秋田君20 天前
深入理解JavaScript设计模式之策略模式
javascript·设计模式·策略模式
lpfasd12320 天前
策略模式(Strategy Pattern)
策略模式