通过枚举实现支付策略模式

简介: 定义支付策略接口及枚举,通过策略模式实现多种支付方式。上下文类管理策略映射,支持动态获取与扩展,提升系统灵活性和可维护性。(239字符)

定义策略接口

/**
 * 支付策略接口
 * <p>定义了支付策略的通用接口,不同的支付方式需要实现该接口</p>
 *
 * @author Administrator
 * @version V1.0
 * @since 2025-09-23 15:39
 */
public interface PayStrategy {

    /**
     * 执行支付操作
     *
     * @param payMethod 支付方式
     * @return 支付结果
     */
    String pay(String payMethod);

    /**
     * 获取支付方式枚举
     *
     * @return PayMethodEnum 支付方式枚举
     * @see PayMethodEnum
     */
    PayMethodEnum getPayMethod();
}

实现类

/**
 * TODO
 *
 * @author Administrator
 * @version V1.0
 * @since 2025-09-23 15:39
 */
public class AliPayServiceImpl implements PayStrategy {
    @Override
    public String pay(String payMethod) {
        return "支付宝支付";
    }

    @Override
    public PayMethodEnum getPayMethod() {
        return PayMethodEnum.ALIPAY;
    }
}

定义枚举类

/**
 * Payment Method Enumeration
 * @author Administrator
 */
@Getter
public enum PayMethodEnum {
    ALIPAY("Alipay", "支付宝"),
    WECHAT_PAY("WeChat Pay", "微信支付"),
    UNION_PAY("Union Pay", "银联支付"),
    CREDIT_CARD("Credit Card", "信用卡"),
    DEBIT_CARD("Debit Card", "借记卡"),
    PAYPAL("PayPal", "贝宝"),
    APPLE_PAY("Apple Pay", "苹果支付"),
    GOOGLE_PAY("Google Pay", "谷歌支付");

    @JsonValue
    private final String type;
    private final String name;

    PayMethodEnum(String type, String name) {
        this.type = type;
        this.name = name;
    }
}

定义支付上下文

/**
 * 支付上下文类
 * <p>该类负责管理不同的支付策略,根据支付方式枚举获取对应的支付策略实现</p>
 * <p>使用策略模式实现,支持扩展新的支付方式</p>
 *
 * @author Administrator
 * @version V1.0
 * @since 2025-09-23 15:36
 */
@Component
public class PayContext {
    /**
     * 支付策略映射表
     * <p>使用EnumMap提高性能,Key为支付方式枚举,Value为对应的支付策略实现</p>
     */
    private final Map<PayMethodEnum, PayStrategy> payStrategyMap;

    /**
     * 构造函数
     * <p>初始化支付策略映射表,将所有支付策略实现注册到映射表中</p>
     *
     * @param payStrategyList 支付策略实现列表
     */
    public PayContext(List<PayStrategy> payStrategyList) {
        this.payStrategyMap = new EnumMap<>(PayMethodEnum.class);
        payStrategyList.forEach(payStrategy -> payStrategyMap.put(payStrategy.getPayMethod(), payStrategy));
    }

    /**
     * 根据支付方式获取对应的支付策略
     * <p>通过支付方式枚举从映射表中查找对应的支付策略实现</p>
     *
     * @param payMethod 支付方式枚举
     * @return 对应的支付策略实现
     * @throws IllegalArgumentException 当找不到对应支付策略时抛出异常
     */
    public PayStrategy getPayStrategy(PayMethodEnum payMethod) {
        PayStrategy payStrategy = payStrategyMap.get(payMethod);
        if (payStrategy == null) {
            throw new IllegalArgumentException(String.format("No strategy found for type: %s", payMethod));
        }
        return payStrategy;
    }

    /**
     * 示例演示方法
     * <p>演示如何使用PayContext获取并执行支付策略</p>
     *
     * @param args 命令行参数
     */
    public static void main(String[] args) {
        PayContext payContext = new PayContext(List.of(new AliPayServiceImpl(), new WechatPayServiceImpl()));
        System.out.println(payContext.getPayStrategy(PayMethodEnum.ALIPAY).pay("ALIPAY"));
    }
}


相关文章
|
存储 前端开发 Java
Element-UI中el-upload上传组件(demo详解)
案例详解Element-UI中el-upload上传组件,一起打卡学习吧!
2899 0
Element-UI中el-upload上传组件(demo详解)
|
Java Spring
springboot跨域配置
springboot跨域配置
768 0
|
存储 Java 调度
开发踩坑记录之二:谨慎使用Spring中的@Scheduled注解
在一些业务场景中需要执行定时操作来完成一些周期性的任务,比如每隔一周删除一周前的某些历史数据以及定时进行某项检测任务等等。在日常开发中比较简单的实现方式就是使用Spring的@Scheduled(具体使用方法不再赘述)注解。但是在修改服务器时间时会导致定时任务不执行情况的发生,解决的办法是当修改服务器时间后,将服务进行重启就可以避免此现象的发生。本文将主要探讨服务器时间修改导致@Scheduled注解失效的原因,同时找到在修改服务器时间后不重启服务的情况下,定时任务仍然正常执行的方法。 @Scheduled失效原因分析 解析流程图 使用新的方法
开发踩坑记录之二:谨慎使用Spring中的@Scheduled注解
|
搜索推荐 Python
将微信聊天做成滚动视频,聊天记录滚动播放
Python实现滚动聊天记录视频制作教程
2870 0
|
6月前
|
人工智能 弹性计算 Go
2026阿里云活动汇总:最新云服务器抢购、AI大模型、云产品组合购及优惠券活动
2026年,阿里云推出了一系列热门活动,涵盖云服务器抢购、AI大模型应用、云产品组合购及优惠券补贴。云服务器活动提供从入门到企业级的完整产品矩阵,满足不同预算和性能需求的用户。AI大模型活动OpenClaw,9.9元起即可三步构建专属AI助理,降低AI应用开发门槛。云产品组合购活动“组合GO”,提供一站式解决方案,享专属优惠。此外,还有各类优惠券和补贴活动,为用户提供额外省钱机会。
1171 9
|
存储 大数据 Unix
Python生成器 vs 迭代器:从内存到代码的深度解析
在Python中,处理大数据或无限序列时,迭代器与生成器可避免内存溢出。迭代器通过`__iter__`和`__next__`手动实现,控制灵活;生成器用`yield`自动实现,代码简洁、内存高效。生成器适合大文件读取、惰性计算等场景,是性能优化的关键工具。
529 2
提升个人工作技能
提升个人工作技能
1927 6
|
缓存 前端开发 JavaScript
利用代码分割优化前端性能:策略与实践
在现代Web开发中,代码分割是提升页面加载性能的有效手段。本文介绍代码分割的概念、重要性及其实现策略,包括动态导入、路由分割等方法,并探讨在React、Vue、Angular等前端框架中的具体应用。
|
SQL 人工智能 关系型数据库
GitHub 热门!MindsDB 破解 AI + 数据库瓶颈,究竟有什么惊艳亮点?只需 SQL 即可实现智能预测
MindsDB 是一款将 AI 能力直接注入数据库的开源工具,支持 MySQL、PostgreSQL 等多种数据库连接,通过 SQL 即可完成模型训练与预测。它提供 AutoML 引擎、LLM 集成、联邦查询等功能,简化 MLOps 流程,实现数据到智能的无缝衔接。项目在 GitHub 上已获 32.4k 星,社区活跃,适用于客户流失预警、推荐系统、情感分析等场景。开发者无需深入模型细节,即可快速构建智能解决方案。项目地址:https://github.com/mindsdb/mindsdb。
1902 0

热门文章

最新文章