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

news2025/5/16 3:40:18

一、支付成功后事件驱动

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


}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2376559.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

5.5.1 WPF中的动画2-基于路径的动画

何为动画?一般只会动。但所谓会动,还不仅包括位置移动,还包括角度旋转,颜色变化,透明度增减。动画本质上是一个时间段内某个属性值(位置、颜色等)的变化。因为属性有很多数据类型,它们变化也需要多种动画类比如: BooleanAnimationBase\ ByteAnimationBase\DoubleAnima…

Andorid之TabLayout+ViewPager

文章目录 前言一、效果图二、使用步骤1.主xml布局2.activity代码3.MyTaskFragment代码4.MyTaskFragment的xml布局5.Adapter代码6.item布局 总结 前言 TabLayoutViewPager功能需求已经是常见功能了&#xff0c;我就不多解释了&#xff0c;需要的自取。 一、效果图 二、使用步骤…

26考研——中央处理器_指令流水线_流水线的冒险与处理 流水线的性能指标 高级流水线技术(5)

408答疑 文章目录 六、指令流水线流水线的冒险与处理结构冒险数据冒险延迟执行相关指令采用转发&#xff08;旁路&#xff09;技术load-use 数据冒险的处理 控制冒险 流水线的性能指标流水线的吞吐率流水线的加速比 高级流水线技术超标量流水线技术超长指令字技术超流水线技术 …

酒店旅游类数据采集API接口之携程数据获取地方美食品列表 获取地方美餐馆列表 景点评论

携程 API 接入指南 API 地址&#xff1a; 调用示例&#xff1a; 美食列表 景点列表 景点详情 酒店详情 参数说明 通用参数说明 请谨慎传递参数&#xff0c;避免不必要的费用扣除。 URL 说明&#xff1a;https://api-gw.cn/平台/API类型/ 平台&#xff1a;淘宝&#xff0c;京…

Lora原理及实现浅析

Lora 什么是Lora Lora的原始论文为《LoRA: Low-Rank Adaptation of Large Language Models》&#xff0c;翻译为中文为“大语言模型的低秩自适应”。最初是为了解决大型语言模在进行任务特定微调时消耗大量资源的问题&#xff1b;随后也用在了Diffusion等领域&#xff0c;用于…

【设计模式】- 创建者模式

单例模型 饿汉式 静态方法创建对象 public class Singleton {// 私有构造方法private Singleton(){}private static Singleton instance new Singleton();// 提供一个外界获取的方法public static Singleton getInstance(){return instance;} }静态代码块创建对象 public …

南审计院考研分享会 经验总结

汪学长 – 中科大 计科专硕 初试准备 数学先做真题&#xff0c;模拟题刷的越多分越高&#xff1b;408真题最重要&#xff0c;模拟题辅助&#xff1b;英语只做真题&#xff1b;政治9月份开始背 代码能力在低年级培养的重要性和路径 考研不选择机构原因 因为机构里面学习的框…

牛客练习赛138(首篇万字题解???)

赛时成绩如下&#xff1a; 1. 小s的签到题 小s拿到了一个比赛榜单&#xff0c;他要用最快的速度找到签到题&#xff0c;但是小s脑子还是有点晕&#xff0c;请你帮帮小s&#xff0c;助力他找到签到题。 比赛榜单是一个 2 行 n 列的表格&#xff1a; 第一行是 n 个大写字母&#…

用git下载vcpkg时出现Connection was reset时的处理

用git安装vcpkg时出现Connect was rest&#xff08;如上图&#xff09;。多谢这位网友的博文解决了问题&#xff1a; 通过:http.sslVerify false全局来设置&#xff0c;执行以下命令&#xff1a; git config --global http.sslVerify "false" 原文链接&#xff1a…

leetcode - 滑动窗口问题集

目录 前言 题1 长度最小的子数组&#xff1a; 思考&#xff1a; 参考代码1&#xff1a; 参考代码2&#xff1a; 题2 无重复字符的最长子串&#xff1a; 思考&#xff1a; 参考代码1&#xff1a; 参考代码2&#xff1a; 题3 最大连续1的个数 III&#xff1a; 思考&am…

一分钟在Cherry Studio和VSCode集成火山引擎veimagex-mcp

MCP的出现打通了AI模型和外部数据库、网页API等资源&#xff0c;成倍提升工作效率。近期火山引擎团队推出了 MCP Server SDK&#xff1a; veimagex-mcp。本文介绍如何在Cherry Studio 和VSCode平台集成 veimagex-mcp。 什么是MCP MCP&#xff08;Model Context Protocol&…

Tomcat与纯 Java Socket 实现远程通信的区别

Servlet 容器​​&#xff08;如 Tomcat&#xff09; 是一个管理 Servlet 生命周期的运行环境&#xff0c;主要功能包括&#xff1a; ​​协议解析​​&#xff1a;自动处理 HTTP 请求/响应的底层协议&#xff08;如报文头解析、状态码生成&#xff09;&#xff1b; ​​线程…

为什么企业建站或独立站选用WordPress

与大多数组织相比&#xff0c;企业业务更需要保持可扩展和可靠的网络存在&#xff0c;以保持竞争力。为此&#xff0c;许多大型企业的 IT 领导者历来寻求昂贵的网络解决方案&#xff0c;这些方案需要签订专有支持合同来保证质量。不过&#xff0c;还有另一种方法。WordPress问世…

镜头内常见的马达类型(私人笔记)

① 螺杆式马达 驱动来源&#xff1a;机身内马达。镜头尾部有一个接收“螺杆”的接口&#xff0c;通过机械传动带动镜头对焦组。缺点&#xff1a;慢、吵、不能用于无机身马达的相机。✅ 典型镜头&#xff1a;尼康 AF、AF-D 系列&#xff1b;美能达老镜头。尼康传统的AF镜头通过…

从代码学习深度学习 - 语义分割和数据集 PyTorch版

文章目录 前言什么是语义分割?图像分割和实例分割Pascal VOC2012 语义分割数据集Pascal VOC2012 语义分割数据集介绍基本信息语义分割部分特点数据格式评价指标应用价值数据集获取使用提示辅助工具代码 (`utils_for_huitu.py`)读取数据预处理数据自定义语义分割数据集类读取数…

4G物联网模块实现废气处理全流程数据可视化监控配置

一、项目背景 随着工业化进程的加速&#xff0c;工业废气的排放对环境造成了严重影响&#xff0c;废气处理厂应运而生。然而&#xff0c;废气处理厂中的设备众多且分散&#xff0c;传统的人工巡检和数据记录方式效率低下&#xff0c;难以及时发现问题。为了实现对废气处理设备…

电商平台如何做好DDoS 攻防战?

一、新型 DDoS 攻击技术演进分析 1.1 电商平台面临的四类攻击范式 graph LR A[DDoS攻击] --> B{网络层} A --> C{应用层} B --> D[CLDAP反射攻击<br>峰值达3.5Tbps] B --> E[QUIC协议洪水攻击] C --> F[API CC攻击<br>精准打击抢购接口] C -->…

【计算机视觉】OpenCV实战项目:Athlete-Pose-Detection 运动员姿态检测系统:基于OpenCV的实时运动分析技术

运动员姿态检测系统&#xff1a;基于OpenCV的实时运动分析技术 1. 项目概述1.1 技术背景1.2 项目特点 2. 技术架构与算法原理2.1 系统架构2.2 核心算法2.3 模型选择 3. 项目部署与运行指南3.1 环境准备硬件要求软件依赖 3.2 项目配置3.3 运行项目基本运行模式高级参数 4. 常见问…

为什么要选择七彩喜数字康养平台?加盟后有何优势?

一&#xff0e;七彩喜数字康养平台 1.技术领先性 七彩喜依托“端-网-云-脑”四层技术架构&#xff0c;整合毫米波雷达、AI算法引擎、区块链等前沿技术&#xff0c;解决传统养老的隐私泄露、设备孤岛等痛点。 比如非接触式健康监测系统通过毫米波雷达实现跌倒检测准确率&#…

【计算机视觉】OpenCV实战项目:基于OpenCV的车牌识别系统深度解析

基于OpenCV的车牌识别系统深度解析 1. 项目概述2. 技术原理与算法设计2.1 图像预处理1) 自适应光照补偿2) 边缘增强 2.2 车牌定位1) 颜色空间筛选2) 形态学操作3) 轮廓分析 2.3 字符分割1) 投影分析2) 连通域筛选 2.4 字符识别 3. 实战部署指南3.1 环境配置3.2 项目代码解析 4.…