一、支付成功后事件驅動
? ? ? ? 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 支付成功事件*/@EventListenerpublic 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 訂單信息*/@Overridepublic void execute(ProductOrderDO productOrderDO) {System.out.println("【新購訂單支付策略】:" + productOrderDO.getId());}/*** 獲取該策略支持的訂單類型** @return 訂單類型*/@Overridepublic String getSupportedOrderType() {return OrderTypeEnum.PURCHASE.getCode();}
}
? ? ? ? ?3、續費訂單支付策略
/*** 續費訂單支付策略** @author ronshi* @date 2025/5/12 15:53*/
@Component
public class RenewPaymentSuccessStrategy implements IPaymentSuccessStrategy {/*** 執行方法** @param productOrderDO 訂單信息*/@Overridepublic void execute(ProductOrderDO productOrderDO) {System.out.println("【續費訂單支付策略】:" + productOrderDO.getId());}/*** 獲取該策略支持的訂單類型** @return 訂單類型*/@Overridepublic 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("沒有對應的訂單支付策略");}}