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

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

1. 定义策略枚举

java 复制代码
@Getter
@RequiredArgsConstructor
public enum PaymentStrategy {
    ALIPAY(1, "支付宝") {
        @Override
        public void processPayment(BigDecimal amount) {
            System.out.println("支付宝支付: " + amount + "元");
            // 调用支付宝SDK的具体逻辑
        }
    },
    WECHAT_PAY(2, "微信支付") {
        @Override
        public void processPayment(BigDecimal amount) {
            System.out.println("微信支付: " + amount + "元");
            // 调用微信支付SDK的具体逻辑
        }
    },
    CREDIT_CARD(3, "信用卡支付") {
        @Override
        public 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)

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

3. 客户端调用

java 复制代码
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. 开闭原则:

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

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

  3. 强类型约束:

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

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

  4. 策略集中管理:

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

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

处理非法支付类型

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

适用场景

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

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

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

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

相关推荐
杨杨杨大侠11 小时前
都能接模型、RAG 和 MCP,Java Agent 框架到底差在哪?
java
破茧蝴蝶11 小时前
Python分布式爬虫完整教程
开发语言·python
狗凯之家源码网11 小时前
全新 PHP 轻量客服聊天室源码深度评测
开发语言·php·聊天室系统
远离UE411 小时前
UE5 Substrate Thin Film 源码拆析
开发语言·javascript·ue5
keyipatience12 小时前
JavaScript学习(1)书写位置,变量、数据类型、运算符
开发语言·前端·javascript·css·学习
Thinker QAQ12 小时前
并发编程(九):BlockingQueue 与 Channel——语言层的原子性、可见性与有序性
java·python·go·并发编程·channel·blockingqueue·message passing
栈帧之外12 小时前
【C++】STL之set
开发语言·c++
霸道流氓气质13 小时前
RAG 可观测性与生产监控实战:四层遥测模型、五大仪表盘与 OpenTelemetry 全链路追踪的 Java 生产级实现
java·人工智能·python
AOI小白新手上路13 小时前
autodl常用的tar 打包下载(数据集)命令手册:逐段拆解与套用模板
java·大数据·数据库
catchadmin13 小时前
免费可商用 PHP 管理后台 CatchAdmin V5.4.1 发布,新增 MCP 支持
开发语言·php