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

在这里插入图片描述

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

使用策略枚举快速消除if else判断

  • 项目场景
  • 你是否也这样判断
  • 使用策略枚举优化
  • 学会举一反三
  • 总结

项目场景

我们先来思考一个问题,在日常开发中涉及到支付往往并非单纯的一个支付厂商,可能涉及支付宝、微信支付等等,再比如项目中根据用户的类型给予不同的折扣,如果你还在使用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 {@Overridepublic String pay(int amount) {System.out.println("使用支付宝支付: " + amount );// 具体的支付逻辑return "ALIPAY SUCCESS";}},WECHAT_PAY {@Overridepublic String pay(int amount) {System.out.println("使用微信支付:" + amount);// 具体的支付逻辑return "WECHAT_PAY SUCCESS";}},UNION_PAY {@Overridepublic 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 {@Overridepublic double calculateDiscount(double amount) {return amount * 0.1;}},PREMIUM {@Overridepublic 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);}
}

总结

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/315536.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TDD-LTE 附着流程和去附着流程

目录 1. 附着流程 1.1. 正常附着流程 2. 异常附着流程 2.1 RRC建立失败 2.2 核心网拒绝 2.3 eNodeB未收到初始化上下文建立请求 2.4 RRC重配置请求丢失 2. 去附着流程 2.1 非关机去附着流程 2.1.1 连接态非关机去附着 2.1.2 空闲态非关机去附着 2.2 关机去附着流程 …

【algorithm】自动驾驶常见常考的几个模型和推导,顺便总结自己遇到的考题经验不断更新之———控制版

写在前面 本来快达成目标了,没想到公司遭受了问题,公司和同事我感觉还是挺好的,有国企的正规也有小企业的灵活,大家都很有学习欲望。 作为本次再次复习回忆如下: 把之前面试准备的 机器学习(基本搬运到CSD…

车载 Android之 核心服务 - CarPropertyService 的VehicleHAL

前言: 本文是车载Android之核心服务-CarPropertyService的第二篇,了解一下CarPropertyService的VehicleHAL, 第一篇在车载 Android之 核心服务 - CarPropertyService 解析-CSDN博客,有兴趣的 朋友可以去看下。 本节介绍 AndroidAutomotiveOS中对于 Veh…

什么是软件测试?这是我听过最通俗易懂的解释

很多人总是说我要学习软件测试,因为他可以拿到一个不错的薪资。 但是当我问他你知道什么是软件测试吗?这个时候,他总会愣住了,一脸不屑的表情说着,不就是找bug,给软件找问题,找茬吗&#xff1f…

混合编程—C++程序中python脚本的嵌入方法(理论部分)

一、C与Python高级编程语言简概 (一)C C是一种被广泛使用的计算机程序设计语言。它是一种通用程序设计语言,支持多重编程范式,例如过程化程序设计(Procedural programming)、面向对象程序设计(…

CISSP 第1章:实现安全治理的原则和策略

作者:nothinghappend 链接:https://zhuanlan.zhihu.com/p/669881930 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 CIA CIA 三性: 机密性:和数据泄露有关。完整性…

odoo17 | 模型和基本字段

前言 在上一章的最后,我们能够创建一个Odoo模块。然而,在这一点上,它仍然是一个空壳,不允许我们这样做 存储任何数据。在我们的房地产模块中,我们希望存储与 数据库中的属性(名称、描述、价格、居住面积等…

【BIG_FG_CSDN】C++ 数组与指针 (个人向——学习笔记)

一维数组 在内存占用连续存储单元的相同类型数据序列的存储。 数组是静态存储器的块;在编译时确定大小后才能使用; 其声明格式如下: 元素类型 数组名[常量];元素类型:数组中元素的数据类型; 常量&#…

Python 自学(二) 之流程控制语句

目录 1. if ... elif ... else 语句 P62 1. if ... elif ... else 语句 P62 每个判断语句后面要加 :elif 的写法比较特别

【搜索引擎】elastic search核心概念

前言 本文不涉及ES的具体安装下载、操作、集群的内容,这部分内容会放在后面一篇文章中。本文只包含ES的核心理论,看完本文再去学ES的细节会事半功倍。 目录 1.由日志存储引出的问题 2.什么是ES? 3.ES的数据结构 4.ES的核心原理 5.联系作…

iOS问题记录 - iOS 17通过NSUserDefaults设置UserAgent无效(续)

文章目录 前言开发环境问题描述问题分析1. 准备源码2. 定位源码3. 对比源码4. 分析总结 解决方案补充内容1. UserAgent的组成2. UserAgent的设置优先级 最后 前言 在上篇文章中对该问题做了一些判断和猜测,并给出了解决方案。不过,美中不足的是没有进一…

Peter算法小课堂—动态规划

Peter推荐算法书:《算法导论》 图示: 目录 钢条切割 打字怪人 钢条切割 算法导论(第四版)第十四章第一节:钢条切割 题目描述: 给定一根长度为 n 英寸的钢条和一个价格表 ,其中 i1,2,…,n …