Java 如何避免代码中大量的 if else 判断

文章目录

  • Java 如何避免代码中大量的 if else 判断
    • 解决方案
      • 1.策略模式
      • 2.工厂模式
      • 3.策略模式 + 工厂模式
      • 4.提前 return(适用于分支逻辑很简单的 if else)
      • 5.枚举

Java 如何避免代码中大量的 if else 判断

在代码中经常会出现 if else 判断,如下图所示:

在这里插入图片描述

两三个还好,但是如果有很多不但影响代码阅读,更会影响代码效率。因此,需要通过一些优化去避免大量的 if else。

解决方案

1.策略模式

策略模式是一种行为型设计模式,它 通过定义一系列算法类(策略类),将算法的实现与使用分离开来,使得算法可以独立于使用它的客户端而变化。在 Java 中,策略模式通常被应用于业务逻辑中,用于处理不同的业务场景和业务规则。

我们可以将各个分支的逻辑封装成不同的策略类,然后通过一个上下文类来根据条件选择合适的策略对象执行相应的逻辑。避免大量的 if else

具体实现如下:

(1) 定义策略类接口或者抽象类,封装具体的算法

/*** 策略接口*/
public interface Strategy {// 定义抽象方法void doSomething();
}

(2)定义多个具体的策略类,实现该接口或抽象类

实现类 1:

/*** 实现类*/
public class ImplementStrategyA implements Strategy {@Overridepublic void doSomething() {//        实现具体算法System.out.println("实现具体算法 A");}
}

实现类 2:

/*** 实现类*/
public class ImplementStrategyB implements Strategy{@Overridepublic void doSomething() {// 实现具体算法System.out.println("实现具体算法 B");}
}

(3)定义一个上下文类,用于管理所有的策略

/*** 上下文类,用于管理所有的策略*/
public class Context {private Strategy strategy;public Context(Strategy strategy) {this.strategy = strategy;}public void doSomethingStrategy() {strategy.doSomething();}
}

最后,在需要的业务逻辑中,传入相应的策略对象,执行对应的算法:

// 使用示例
if (conditionA) {Context context = new Context(new ImplementStrategyA());context.doSomethingStrategy();
} else if (conditionB) {Context context = new Context(new ImplementStrategyB());context.doSomethingStrategy();
}

2.工厂模式

工厂模式是一种 创建型设计模式,它通过定义一个工厂类来封装对象的创建过程,从而将客户端代码与具体的产品实现解耦。在 Java 中,工厂模式通常被应用于对象的创建和组装场景中。具体实现如下:

(1)定义一个 car 接口或抽象类,用于封装 car 的通用接口或抽象父类

public interface Car {void doSomething();
}

(2)定义多个具体的 car 类,实现该接口或抽象父类

实现类 1:

public class Audi implements Car{@Overridepublic void doSomething() {}
}

实现类 2:

public class BMW implements Car {@Overridepublic void doSomething() {}
}

(3)定义一个工厂类,用于创建产品对象

public class Factory {public static Car create(String carName) {switch (carName) {case "奥迪":return new Audi();case "宝马":return new BMW();default:throw new IllegalArgumentException("Invalid carName: " + carName);}}
}

(4)在业务逻辑中,调用工厂类的静态方法,创建对应的产品对象

Car car = Factory.create("宝马");
car.doSomething();

3.策略模式 + 工厂模式

通常我们会把 策略模式 + 工厂模式 进行结合去解决 if else 问题。

案例场景:

如下图所示,不同的 code 编码执行不同的功能。

在这里插入图片描述

(1)条件模块抽象为一个公共的接口,策略接口

public interface Action {void doSomeAction();
}

(2)根据每个逻辑,定义出自己具体的策略实现类

public class executeActionOne implements Action{@Overridepublic void doSomeAction(String code) {System.out.println(code);}
}public class executeActionTwo implements Action{@Overridepublic void doSomeAction(String code) {System.out.println(code);}
}public class executeActionThree implements Action{@Overridepublic void doSomeAction(String code) {System.out.println(code);}
}

(3)工厂类,统一调度,用来管理这些策略(最重要

import java.util.HashMap;
import java.util.Map;/*** 工厂类*/
public class ActionFactory {//    私有构造方法private ActionFactory() {}//    单例private static class SingleHandler {private static ActionFactory instance = new ActionFactory();}//    获得工厂类实例public static ActionFactory getInstance() {return SingleHandler.instance;}private static final Map<String, Action> ACTION_MAP = new HashMap<>();//    工厂类实例放在 map 中static {ACTION_MAP.put("1101", new executeActionOne());ACTION_MAP.put("1102", new executeActionTwo());ACTION_MAP.put("1104", new executeActionThree());}//    根据不同的编码获得不同的实现类实例public static Action getAction(String actionCode) {Action action = ACTION_MAP.get(actionCode);if (action == null) {throw new RuntimeException("无效 actionCode");}return action;}//    调用实现类所在方法public void doAction(String actionCode) {getAction(actionCode).doSomeAction(actionCode);}
}

(4)业务逻辑中调用

 ActionFactory.getInstance().doAction("1101");

4.提前 return(适用于分支逻辑很简单的 if else)

if (condition) {// 业务逻辑;} else {return;}// 优化后if (!condition) {return;} // 业务逻辑;

5.枚举

如下代码:业务中需要大量 if else

		String productStatus;if ("1".equals(statusCode)) {productStatus = "商品已售出";} else if ("2".equals(statusCode)) {productStatus = "商品已售罄";} else if ("3".equals(statusCode)) {productStatus = "商品货存充足";} else if ("4".equals(statusCode)) {productStatus = "商品需采购";}

利用枚举优化,定义枚举:

public enum ProductStatusEnum {HAVE_SOLD("1", "商品已售出"),SOLD_ALL("2", "商品已售罄"),PRODUCT_FULL("3", "商品货存充足"),NEED_BUY("4", "商品需采购");private String statusCode;private String productStatus;public String getStatusCode() {return statusCode;}public String getProductStatus() {return productStatus;}// 全参构造ProductStatusEnum(String statusCode, String productStatus) {this.statusCode = statusCode;this.productStatus = productStatus;}static ProductStatusEnum of(String statusCode) {for (ProductStatusEnum statusEnum : ProductStatusEnum.values()) {if (statusEnum.getStatusCode().equals(statusCode)) {return statusEnum;}}return null;}
}

业务逻辑调用:

String productStatus = ProductStatusEnum.of("1").getProductStatus();

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

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

相关文章

当众演讲技巧的方法有哪些(3篇)

当众演讲技巧的方法有哪些&#xff08;3篇&#xff09; 当众演讲技巧的方法有很多&#xff0c;下面我将分三篇来详细阐述其中的一些关键技巧&#xff1a; **篇&#xff1a;准备与开场技巧 充分准备&#xff1a;提前规划演讲内容&#xff0c;明确主题和目标&#xff0c;准备详…

【蓝桥杯C++A组省三 | 一场勇敢的征途与致19岁的信】

随着4.13西大四楼考场的倒计时结束… 就这样蓝桥杯落幕了 省三的名次既满足又不甘心&#xff0c;但又确乎说得上是19岁途中的又一枚勋章 从去年得知&#xff0c;纠结是否要报名、到寒假开始战战兢兢地准备、陆续开始创作博客&#xff0c;记录好题和成长……感谢你们的关注&…

APT预警攻击平台截获Nday

APT预警攻击平台截获Nday 2024年4月26日 设备漏洞【漏洞利用】H3C Magic R100任意代码执行漏洞(CVE-2022-34598) 0000 &#xff1a; 0010 &#xff1a; 0020 &#xff1a; 0030 &#xff1a; 0040 &#xff1a; 0050 &#xff1a; 0060 &#xff1a; 0070 &#xff1a;6F 72…

请求接口报错:java.lang.IllegalStateException: argument type mismatch

目录 一、场景二、报错信息三、控制器四、接口调用五、原因六、解决 一、场景 1、调用后端接口报错 2、接口参数以Json方式传递 – 二、报错信息 java.lang.IllegalStateException: argument type mismatch Controller [com.xxx.huarunshouzheng.controller.MallControlle…

CCF-CSP真题题解:201409-3 字符串匹配

201409-3 字符串匹配 #include <iostream> #include <cstring> #include <algorithm> using namespace std;int n, type; string s, p;string tolower(string s) {string res;for (char c : s) res tolower(c);return res; }int main() {cin >> p >…

【探索Linux】P.33(HTTP协议)

阅读导航 引言一、认识URL二、URL编码和解码1. Urlencode&#xff08;URL编码&#xff09;2. Urldecode&#xff08;URL解码&#xff09; 三、HTTP的方法四、HTTP的状态码五、HTTP常见Header六、最简单的HTTP服务器温馨提示 引言 在上一篇文章中&#xff0c;我们深入探讨了“自…

LLaMA3(Meta)微调SFT实战Meta-Llama-3-8B-Instruct

LlaMA3-SFT LlaMA3-SFT, Meta-Llama-3-8B/Meta-Llama-3-8B-Instruct微调(transformers)/LORA(peft)/推理 项目地址 https://github.com/yongzhuo/LLaMA3-SFT默认数据类型为bfloat6 备注 1. 非常重要: weights要用bfloat16/fp32/tf32(第二版大模型基本共识), 不要用fp16, f…

坚守食品安全,美乐家(中国)守护大众健康

在现代社会&#xff0c;食品安全已成为公众关注的焦点&#xff0c;对于食品行业的企业而言&#xff0c;确保食品安全是极为重要的责任。产品是消费者与企业之间最直接、最紧密的纽带&#xff0c;也是消费者对品牌的最直观印象。因此&#xff0c;美乐家一直将产品质量、安全、绿…

【TCP:可靠数据传输,快速重传,流量控制,TCP流量控制】

文章目录 可靠数据传输TCP&#xff1a;可靠数据传输TCP发送方事件快速重传流量控制TCP流量控制 可靠数据传输 TCP&#xff1a;可靠数据传输 TCP在IP不可靠服务的基础上建立了rdt 管道化的报文段 GBN or SR 累计确认&#xff08;像GBN&#xff09;单个重传定时器&#xff08;像…

XYCTF 2024

Web 参考博客&#xff1a;https://www.yuque.com/yunzhiyunweiji/wrgkex/rfpnkn0293l7cp09#ezMake ezhttp Via - HTTP | MDN 代理那里难住了 XFF不给用可以用client-ip ezmd5 让我们上传图片并比较&#xff0c;结合题目名可以猜测应该是比较两个图片的md5值是否相同&…

ES6之rest参数、扩展运算符

文章目录 前言一、rest参数二、扩展运算符 1.将数组转化为逗号分隔的参数序列2.应用总结 前言 rest参数与arguments变量相似。ES6引入rest参数代替arguments&#xff0c;获取函数实参。扩展运算符能将数组转化为参数序列。 一、rest参数 function namelist1() {console.log(ar…

使用硬盘对拷方法将数据无损转移到另一个硬盘!

硬盘对拷&#xff0c;其实就是磁盘克隆&#xff0c;很多人喜欢将其说成对拷&#xff0c;或者硬盘复制等&#xff0c;但不管怎么说&#xff0c;他们的目的都是一个&#xff0c;想要把原硬盘上的全部数据&#xff08;包括系统、程序、个人文件、隐藏配置数据等&#xff09;都无损…

【好书推荐8】《智能供应链:预测算法理论与实战》

【好书推荐8】《智能供应链&#xff1a;预测算法理论与实战》 写在最前面编辑推荐内容简介作者简介目录精彩书摘前言/序言我为什么要写这本书这本书能带给你什么 致谢 &#x1f308;你好呀&#xff01;我是 是Yu欸 &#x1f30c; 2024每日百字篆刻时光&#xff0c;感谢你的陪伴…

Notion是什么,Notion软件下载,Notion官方网站在哪里?国内用户Notion怎么订阅升级会员?

Notion是什么 Notion&#xff0c;一款强大的多功能工具&#xff0c;可用于组织笔记、任务、项目、数据库和文档等。 Notion软件下载 这个到Notion官方网站下载就可以了。 怎么订阅Notion会员 注册好了Notion的账号&#xff0c;来到首页&#xff0c;点击设置&#xff0c;左边…

虚析构与纯虚析构

这里的new Cat("Tom"&#xff09;是由于基类函数中的构造函数里面带有string变量 1. 法一:利用虚函数&#xff0c;虚化基类中的析构函数 virtual ~Animal() { cout << "动物的析构函数调用" << endl; } 2. 法二:利用纯…

JAVA自定义日期选择器

下载jar地址&#xff0c; https://toedter.com/jcalendar/ jar包下载地址 依赖包如下图所示&#xff1a; 整个项目代码已经上传到CSDN https://download.csdn.net/download/qq_30273575/89241601?ydrefereraHR0cHM6Ly9tcC5jc2RuLm5ldC9tcF9kb3dubG9hZC9tYW5hZ2UvZG93bmxvYWQ…

ROS1快速入门学习笔记 - 10服务数据的定义和使用

目录 一、服务模型&#xff08;客户端/服务器&#xff09; 二、自定义服务数据 1. 定义srv文件 2. 在package.xml中添加功能包依赖 3. 在CMakeLists.txt添加编译选项 4. 编译生成语言相关文件 5. 配置服务器/客户端代码编译规则 6. 编译并运行程序 7. Python文件 一…

图论单源最短路径——spfa

【模板】单源最短路径&#xff08;弱化版&#xff09; 本题用的spfa 题目背景 本题测试数据为随机数据&#xff0c;在考试中可能会出现构造数据让SPFA不通过&#xff0c;如有需要请移步 P4779。 题目描述 如题&#xff0c;给出一个有向图&#xff0c;请输出从某一点出发到…

若依:Linux Centos 7.9 安装部署RuoYi前后端集成版

目录 1.虚拟机操作系统版本 2.删除旧的jdk 3.下载JDK 17 &#xff1a; 4.下载 mvn 3.9.6&#xff1a; 5.下载mysql:5.7.44版本 6.git下载若依&#xff1a; 7.修改数据库连接&#xff1a; 8.mvn 清理和打包 9.启动若依&#xff1a; 1.虚拟机操作系统版本 2.删除旧的jd…

几个容器网络问题实战解析

容器云平台和容器网络紧密结合&#xff0c;共同构建了容器化应用程序的网络基础设施&#xff0c;实现了容器之间的通信、隔离和安全性。文中容器云平台采用的容器网络组件是calico&#xff0c;这个是业界普遍采用的一种方案&#xff0c;性能及安全性在同类产品中都是比较好的。…