教你用策略枚举消除if-else判断(以支付场景为例子)带给你新的认知,记得收藏哦~

本文介绍了如何使用策略枚举在Java项目中替换if-else判断,优化支付逻辑,如支付宝、微信支付等,同时展示了如何将此模式扩展到用户类型和折扣计算,提高代码可读性和可维护性。
摘要由CSDN通过智能技术生成

在这里插入图片描述

😄 19年之后由于某些原因断更了三年,23年重新扬帆起航,推出更多优质博文,希望大家多多支持~
🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志
🎐 个人CSND主页——Micro麦可乐的博客
🐥《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程,入门到实战
🌺《RabbitMQ》本专栏主要介绍使用JAVA开发RabbitMQ的系列教程,从基础知识到项目实战
🌸《设计模式》专栏以实际的生活场景为案例进行讲解,让大家对设计模式有一个更清晰的理解
如果文章能够给大家带来一定的帮助!欢迎关注、评论互动~

项目场景

我们先来思考一个问题,在日常开发中涉及到支付往往并非单纯的一个支付厂商,可能涉及支付宝、微信支付等等,再比如项目中根据用户的类型给予不同的折扣,如果你还在使用if -else来进行支付类型、用户类型判断,那么请认真看完本篇内容,相信能让你有一个新的认识

你是否也这样判断

我们还是以上述场景来模拟一个支付功能,在你们的项目中是否是这样子判断的,前端传递一个支付类型 payType,在业务代码中判断这个类型从而执行对应的厂商支付

        if ("ALIPAY".equals(payType)) {
            //调用支付宝支付
        } else if ("WECHAT_PAY".equals(payType)) {
            //调用微信支付
        } else if ("UNION_PAY".equals(payType)) {
            //调用银联支付
        } else if ...

从代码可以看出,如果设计到很多种支付类型,那么会出现大量的if-else,着实是一件很影响性能的事情,有没有更好的方案可以替代?答案是有的!

使用策略枚举优化

在项目中我们可以使用枚举(enum)来实现策略模式,并通过枚举常量来消除 if-else 语句,使代码更加灵活、可维护和可扩展,还是上述的支付场景,我们如何使用策略枚举更优雅的实现

定义策略枚举,分别定义 ALIPAY、WECHAT_PAY、UNION_PAY 代表支付宝、微信、银联支付

// 定义策略枚举
public enum PaymentStrategyEnum {
    ALIPAY {
        @Override
        public String pay(int amount) {
            System.out.println("使用支付宝支付: " + amount );
            // 具体的支付逻辑
            return "ALIPAY SUCCESS";
        }
    },
    WECHAT_PAY {
        @Override
        public String pay(int amount) {
            System.out.println("使用微信支付:" + amount);
            // 具体的支付逻辑
            return "WECHAT_PAY SUCCESS";
        }
    },
    UNION_PAY {
        @Override
        public String pay(int amount) {
            System.out.println("使用银联支付:" + amount);
            // 具体的支付逻辑
            return "WECHAT_PAY SUCCESS";
        }
    };

    // 定义抽象方法
    public abstract String pay(int amount);
}

定一个通用的调用支付类,传递枚举对象以及支付金额

public class CheckPay {
    public String toPay(PaymentStrategyEnum paymentStrategyEnum, int amount) {
        return paymentStrategyEnum.pay(amount);
    }
}

前端唤起支付使用了哪个厂商的支付,就传递约定好的参数值,这里为了方便我们就直接以 ALIPAY、WECHAT_PAY、UNION_PAY 作为类型参数

演示代码

public class PayServiceTest {
    public static void main(String[] args) {
//        // 在应用中选择支付策略
//        PaymentStrategyEnum alipay = PaymentStrategyEnum.ALIPAY;
//        PaymentStrategyEnum wechatPay = PaymentStrategyEnum.WECHAT_PAY;
//
//        alipay.pay(100);
//        wechatPay.pay(150);
        pay("ALIPAY",100);
        pay("WECHAT_PAY",150);
        pay("UNION_PAY",200);

    }

    public static String pay(String payType, int amount) {
        CheckPay checkPay = new CheckPay();
        return checkPay.toPay(PaymentStrategyEnum.valueOf(payType),amount);
    }
}

最终输出效果
在这里插入图片描述
在这个示例中,通过使用枚举,每个支付方式都被表示为一个枚举常量,并且每个枚举常量都实现了抽象方法 pay。这种方式可以消除传统的 if-else 语句,并通过直接调用枚举常量的方法来执行相应的支付逻辑。如果需要添加新的支付方式,只需简单地在枚举中添加新的常量即可。

学会举一反三

通过上述支付的代码演示,我们可以思考一下针对不同的用户类型,给予不同的优惠折扣是否也可以使用这种模式?来看看简单的代码样列

// 用户类
class User {
    private UserType userType;

    public User(UserType userType) {
        this.userType = userType;
    }

    public double calculateDiscount(double amount) {
        return userType.calculateDiscount(amount);
    }
}

// 用户类型的策略枚举
enum UserType {
    REGULAR {
        @Override
        public double calculateDiscount(double amount) {
            return amount * 0.1;
        }
    },
    PREMIUM {
        @Override
        public double calculateDiscount(double amount) {
            return amount * 0.2;
        }
    };

    // 定义抽象方法
    public abstract double calculateDiscount(double amount);
}

public class Main {
    public static void main(String[] args) {
        double amount = 100.0;
        //这里模拟知道了用户类型
        User regularUser = new User(UserType.REGULAR);
		//User premiumUser = new User(UserType.PREMIUM);
		
        double regularDiscount = regularUser.calculateDiscount(amount);
        //double premiumDiscount = premiumUser.calculateDiscount(amount);
        
        System.out.println("Regular User Discount: " + regularDiscount);
        //System.out.println("Premium User Discount: " + premiumDiscount);
    }
}

总结

使用策略枚举可以很灵活处理各种复杂判断,且可读性与扩展性都比较好,它更像是函数式编程,即传进一个参数,就可以得到对应模式下返回的数值。这样的设计使得系统更具可读性、可维护性,也更符合开放/封闭原则。

  • 40
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
策略模式(Strategy Pattern)是行为设计模式的一种,它提供了一种定义一系列算法,并让它们之间可以互相替换的方式,而无需改变使用算法的客户端代码。在Java中,枚类型非常适合用来实现策略模式,因为每个枚常量实际上就是一个独立的行为或策略。 具体实现步骤如下: 1. 定义接口或抽象类:创建一个接口或抽象类,描述了所有可能的策略,这些策略是共通的接口,但具体实现不同。例如: ```java public abstract class OperationStrategy { public abstract int execute(int a, int b); } ``` 2. 枚类:为每个具体的策略创建一个枚类,继承自第一步中的接口或抽象类。每个枚常量代表一种不同的执行操作。比如: ```java public enum OperationType implements OperationStrategy { ADDITION { @Override public int execute(int a, int b) { return a + b; } }, SUBTRACTION { @Override public int execute(int a, int b) { return a - b; } }; // 实现execute方法的具体逻辑 } ``` 3. 使用策略:客户端代码可以通过`OperationType`变量选择不同的策略并调用其执行方法。例如: ```java public void performOperation(OperationStrategy strategy, int a, int b) { int result = strategy.execute(a, b); System.out.println("Result is: " + result); } public static void main(String[] args) { performOperation(OperationType.ADDITION, 10, 5); // 输出:Result is: 15 performOperation(OperationType.SUBTRACTION, 10, 5); // 输出:Result is: 5 } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Micro麦可乐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值