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

枚举策略模式实战:优雅消除支付场景的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.xdnf.cn/news/16465.html

相关文章:

  • ANSYS Products 2025 R2 安装配置全流程教程(图文详解)
  • Kafka 顺序消费实现与优化策略
  • 【智慧物联网平台】编译jar环境 Linux 系统编译IOT物联网——仙盟创梦IDE
  • MySQL SQL性能优化与慢查询分析实战指南:新手DBA成长之路
  • 接口测试核心概念与实践指南
  • Error reading config file (/home/ansible.cfg): ‘ACTION_WARNINGS(default) = True
  • ABP Framework + EF Core 迁移命令失败问题完整解决记录
  • 开发笔记 | 实现人物立绘的差分效果
  • 全面解析MySQL(4)——三大范式与联合查询实例教程
  • LeetCode|Day28|67. 二进制求和|Python刷题笔记
  • 【MySQL学习|黑马笔记|Day1】数据库概述,SQL|通用语法、SQL分类、DDL
  • 归档日志-binlog
  • 元宇宙工厂前端新形态:Three.js与WebGL实现3D产线交互的轻量化之路
  • XCF32PVOG48C Xilinx Platform Flash PROM
  • Maven中的bom和父依赖
  • [Linux]线程池
  • 【免费可用】【提供源代码】对YOLOV11模型进行剪枝和蒸馏
  • 跨境协作系统文化适配:多语言环境下的业务符号隐喻与交互习惯
  • Java项目:基于SSM框架实现的社区团购管理系统【ssm+B/S架构+源码+数据库+毕业论文+答辩PPT+远程部署】
  • Nuxt3 全栈作品【通用信息管理系统】修改密码
  • 亚远景-“过度保守”还是“激进创新”?ISO/PAS 8800的99.9%安全阈值之争
  • 【NLP舆情分析】基于python微博舆情分析可视化系统(flask+pandas+echarts) 视频教程 - 微博文章数据可视化分析-点赞区间实现
  • 【HTTP】防XSS+SQL注入:自定义HttpMessageConverter过滤链深度解决方案
  • 【数据标注】详解使用 Labelimg 进行数据标注的 Conda 环境搭建与操作流程
  • 572. 另一棵树的子树
  • 电子签章(PDF)
  • 【0基础PS】PS工具详解--选择工具--对象选择工具
  • 【Linux | 网络】传输层(UDP和TCP) - 两万字详细讲解!!
  • 利用软件定义无线USRP X410、X440 电推进无线原型设计
  • ksql连接数据库免输入密码交互