当前位置: 首页 > news >正文

枚举策略模式实战:优雅消除支付场景的if-else

在支付场景中使用枚举实现策略模式,可以优雅地消除if-else语句,提高代码的可读性、可维护性和扩展性。以下是具体实现方案:

1. 定义策略枚举

@Getter
@RequiredArgsConstructor
public enum PaymentStrategy {ALIPAY(1, "支付宝") {@Overridepublic void processPayment(BigDecimal amount) {System.out.println("支付宝支付: " + amount + "元");// 调用支付宝SDK的具体逻辑}},WECHAT_PAY(2, "微信支付") {@Overridepublic void processPayment(BigDecimal amount) {System.out.println("微信支付: " + amount + "元");// 调用微信支付SDK的具体逻辑}},CREDIT_CARD(3, "信用卡支付") {@Overridepublic void processPayment(BigDecimal amount) {System.out.println("信用卡支付: " + amount + "元");// 调用银行API的逻辑}};/*** 编码*/private final Integer code;/*** 说明*/private final String desc;/*** 抽象支付方法(策略接口)* @param amount 支付金额*/public abstract void processPayment(BigDecimal amount);
}

2. 上下文处理器(消除 if-else)

public class PaymentProcessor {public void executePayment(String paymentType, BigDecimal amount) {// 通过枚举名直接获取策略(无需条件判断)PaymentStrategy strategy = PaymentStrategy.valueOf(paymentType.toUpperCase());strategy.processPayment(amount);}
}

3. 客户端调用

public class Client {public static void main(String[] args) {PaymentProcessor processor = new PaymentProcessor();// 直接通过支付类型字符串调用(无if-else)processor.executePayment("ALIPAY", new BigDecimal("100.50"));processor.executePayment("WECHAT_PAY", new BigDecimal("200.00"));}
}

优势分析

  1. 消除条件判断

    • 直接通过valueOf()将字符串映射到枚举策略,彻底消除if-else/switch

  2. 开闭原则

    // 扩展新支付方式只需添加枚举常量
    PaymentStrategy.BANK_TRANSFER {@Overridepublic void processPayment(BigDecimal amount) {System.out.println("银行转账: " + amount);}
    };

    新增策略时 无需修改已有代码,符合开放-封闭原则

  3. 强类型约束

    • 编译器会强制要求每个枚举实现策略方法

    • 避免字符串拼写错误(IllegalArgumentException

  4. 策略集中管理

    • 所有策略在枚举中一目了然

    • 天然的单例保证(无需考虑线程安全问题)

处理非法支付类型

public void executePayment(String paymentType, BigDecimal amount) {try {PaymentStrategy strategy = PaymentStrategy.valueOf(paymentType.toUpperCase());strategy.processPayment(amount);} catch (IllegalArgumentException e) {// 统一处理未知支付类型throw new UnsupportedPaymentTypeException("不支持的支付方式: " + paymentType);}
}

适用场景

  • 策略类型固定且有限(如支付方式、状态机)

  • 需要强类型约束和编译期检查

  • 策略本身无需复杂状态维护

对比传统工厂模式:枚举策略模式更简洁,但扩展性略低于类层次结构实现。适合策略数量可控的场景,若策略行为过于复杂或需要动态加载,建议采用传统接口+实现类的方式。

http://www.lryc.cn/news/602180.html

相关文章:

  • 时序数据基座升维:Apache IoTDB 以“端边云AI一体化”重构工业智能决策
  • 企业级JWT验证最佳方案:StringUtils.hasText()
  • 【学习路线】AI开发工程师成长指南:从机器学习基础到大模型应用
  • Ubuntu服务器上JSP运行缓慢怎么办?全面排查与优化方案
  • Python 列表内存存储本质:存储差异原因与优化建议
  • 【Linux | 网络】传输层(UDP和TCP) - 两万字详细讲解!!
  • 二级域名分发源码最新开源版
  • uni-datetime-picker兼容ios
  • 无界设计新生态:Penpot开源平台与cpolar的云端协同创新实践
  • CacheGen:用于快速大语言模型推理服务的 KV 缓存压缩与流式传输
  • 【Unity笔记】Unity Camera.cullingMask 使用指南:Layer 精准控制、XR 多视图与性能提升
  • Python + Requests库爬取动态Ajax分页数据
  • 云原生作业(haproxy)
  • 迅为RK3568开发板OpeHarmony学习开发手册-配置电源管理芯片和点亮HDMI屏幕-配置电源管理芯片
  • Vue2-封装一个含所有表单控件且支持动态增减行列的表格组件
  • 行业案例:杰和科技为智慧教育构建数字化硬件底座
  • vue如何在data里使用this
  • 【保姆级喂饭教程】Python依赖管理工具大全:Virtualenv、venv、Pipenv、Poetry、pdm、Rye、UV、Conda、Pixi等
  • 热门JavaScript库“is“等软件包遭npm供应链攻击植入后门
  • 【SpringMVC】MVC中Controller的配置 、RestFul的使用、页面重定向和转发
  • 构建你的专属区块链:深入了解 Polkadot SDK
  • C语言-数组:数组(定义、初始化、元素的访问、遍历)内存和内存地址、数组的查找算法和排序算法;
  • 《 服务注册发现原理:从 Eureka 到 Nacos 的演进》
  • Docker搭建Hadoop集群
  • 【科普】STM32CubeMX是配置工具,STM32CubeIDE是集成开发环境,二者互补但定位不同,前者负责初始化配置,后者专注代码开发调试。
  • 魔术橡皮:一键抠图、一键去除图片多余物体软件、图片变清晰软件、图片转漫画软件、图片转素描软件
  • 【C++详解】深入解析继承 类模板继承、赋值兼容转换、派生类默认成员函数、多继承与菱形继承
  • sqli-labs通关笔记-第23关 GET字符型注入(单引号闭合-过滤注释符 手工注入+脚本注入两种方法)
  • 常见的接⼝测试⾯试题
  • 【深度学习优化算法】10:Adam算法