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

java中如何优化大量的if...else...

目录

策略模式(Strategy Pattern)

工厂模式(Factory Pattern)

映射表(Map)

数据驱动设计(Data-Driven Design) 


策略模式(Strategy Pattern)

将每个条件分支的实现作为一个独立的策略类,然后使用一个上下文对象来选择要执行的策略。这种方法可以将大量的if else语句转换为对象之间的交互,从而提高代码的可维护性和可扩展性。

示例:

 首先,我们定义一个接口来实现所有策略的行为:

public interface PaymentStrategy {void pay(double amount);
}

接下来,我们定义具体的策略类来实现不同的支付方式: 

public class CreditCardPaymentStrategy implements PaymentStrategy {private String name;private String cardNumber;private String cvv;private String dateOfExpiry;public CreditCardPaymentStrategy(String name, String cardNumber, String cvv, String dateOfExpiry) {this.name = name;this.cardNumber = cardNumber;this.cvv = cvv;this.dateOfExpiry = dateOfExpiry;}public void pay(double amount) {System.out.println(amount + " paid with credit card");}
}public class PayPalPaymentStrategy implements PaymentStrategy {private String emailId;private String password;public PayPalPaymentStrategy(String emailId, String password) {this.emailId = emailId;this.password = password;}public void pay(double amount) {System.out.println(amount + " paid using PayPal");}
}public class CashPaymentStrategy implements PaymentStrategy {public void pay(double amount) {System.out.println(amount + " paid in cash");}
}

现在,我们可以在客户端代码中创建不同的策略对象,并将它们传递给一个统一的支付类中,这个支付类会根据传入的策略对象来调用相应的支付方法: 

public class ShoppingCart {private List<Item> items;public ShoppingCart() {this.items = new ArrayList<>();}public void addItem(Item item) {this.items.add(item);}public void removeItem(Item item) {this.items.remove(item);}public double calculateTotal() {double sum = 0;for (Item item : items) {sum += item.getPrice();}return sum;}public void pay(PaymentStrategy paymentStrategy) {double amount = calculateTotal();paymentStrategy.pay(amount);}
}

现在我们可以使用上述代码来创建一个购物车,向其中添加一些商品,然后使用不同的策略来支付: 

public class Main {public static void main(String[] args) {ShoppingCart cart = new ShoppingCart();Item item1 = new Item("1234", 10);Item item2 = new Item("5678", 40);cart.addItem(item1);cart.addItem(item2);// pay by credit cardcart.pay(new CreditCardPaymentStrategy("John Doe", "1234567890123456", "786", "12/22"));// pay by PayPalcart.pay(new PayPalPaymentStrategy("myemail@example.com", "mypassword"));// pay in cashcart.pay(new CashPaymentStrategy());//--------------------------或者提前将不同的策略对象放入map当中,如下Map<String, PaymentStrategy> paymentStrategies = new HashMap<>();paymentStrategies.put("creditcard", new CreditCardPaymentStrategy("John Doe", "1234567890123456", "786", "12/22"));paymentStrategies.put("paypal", new PayPalPaymentStrategy("myemail@example.com", "mypassword"));paymentStrategies.put("cash", new CashPaymentStrategy());String paymentMethod = "creditcard"; // 用户选择的支付方式PaymentStrategy paymentStrategy = paymentStrategies.get(paymentMethod);cart.pay(paymentStrategy);}
}

工厂模式(Factory Pattern)

将每个条件分支的实现作为一个独立的产品类,然后使用一个工厂类来创建具体的产品对象。这种方法可以将大量的if else语句转换为对象的创建过程,从而提高代码的可读性和可维护性。

示例: 

// 定义一个接口
public interface StringProcessor {public void processString(String str);
}// 实现接口的具体类
public class LowercaseStringProcessor implements StringProcessor {public void processString(String str) {System.out.println(str.toLowerCase());}
}public class UppercaseStringProcessor implements StringProcessor {public void processString(String str) {System.out.println(str.toUpperCase());}
}public class ReverseStringProcessor implements StringProcessor {public void processString(String str) {StringBuilder sb = new StringBuilder(str);System.out.println(sb.reverse().toString());}
}// 工厂类
public class StringProcessorFactory {public static StringProcessor createStringProcessor(String type) {if (type.equals("lowercase")) {return new LowercaseStringProcessor();} else if (type.equals("uppercase")) {return new UppercaseStringProcessor();} else if (type.equals("reverse")) {return new ReverseStringProcessor();}throw new IllegalArgumentException("Invalid type: " + type);}
}// 测试代码
public class Main {public static void main(String[] args) {StringProcessor sp1 = StringProcessorFactory.createStringProcessor("lowercase");sp1.processString("Hello World");StringProcessor sp2 = StringProcessorFactory.createStringProcessor("uppercase");sp2.processString("Hello World");StringProcessor sp3 = StringProcessorFactory.createStringProcessor("reverse");sp3.processString("Hello World");}
}

 看起来还是有if...else,但这样的代码更加简洁易懂,后期也便于维护....


映射表(Map)

使用一个映射表来将条件分支的实现映射到对应的函数或方法上。这种方法可以减少代码中的if else语句,并且可以动态地更新映射表,从而提高代码的灵活性和可维护性。 

示例:

import java.util.HashMap;
import java.util.Map;
import java.util.function.Function;public class MappingTableExample {private Map<String, Function<Integer, Integer>> functionMap;public MappingTableExample() {functionMap = new HashMap<>();functionMap.put("add", x -> x + 1);functionMap.put("sub", x -> x - 1);functionMap.put("mul", x -> x * 2);functionMap.put("div", x -> x / 2);}public int calculate(String operation, int input) {if (functionMap.containsKey(operation)) {return functionMap.get(operation).apply(input);} else {throw new IllegalArgumentException("Invalid operation: " + operation);}}public static void main(String[] args) {MappingTableExample example = new MappingTableExample();System.out.println(example.calculate("add", 10));System.out.println(example.calculate("sub", 10));System.out.println(example.calculate("mul", 10));System.out.println(example.calculate("div", 10));System.out.println(example.calculate("mod", 10)); // 抛出异常}
}

数据驱动设计(Data-Driven Design) 

将条件分支的实现和输入数据一起存储在一个数据结构中,然后使用一个通用的函数或方法来处理这个数据结构。这种方法可以将大量的if else语句转换为数据结构的处理过程,从而提高代码的可扩展性和可维护性。 

示例:

import java.util.ArrayList;
import java.util.List;
import java.util.function.Function;public class DataDrivenDesignExample {private List<Function<Integer, Integer>> functionList;public DataDrivenDesignExample() {functionList = new ArrayList<>();functionList.add(x -> x + 1);functionList.add(x -> x - 1);functionList.add(x -> x * 2);functionList.add(x -> x / 2);}public int calculate(int operationIndex, int input) {if (operationIndex < 0 || operationIndex >= functionList.size()) {throw new IllegalArgumentException("Invalid operation index: " + operationIndex);}return functionList.get(operationIndex).apply(input);}public static void main(String[] args) {DataDrivenDesignExample example = new DataDrivenDesignExample();System.out.println(example.calculate(0, 10));System.out.println(example.calculate(1, 10));System.out.println(example.calculate(2, 10));System.out.println(example.calculate(3, 10));System.out.println(example.calculate(4, 10)); // 抛出异常}
}

👍点赞,你的认可是我创作的动力 !
🌟收藏,你的青睐是我努力的方向!
✏️评论,你的意见是我进步的财富!   

相关文章:

java中如何优化大量的if...else...

目录 策略模式&#xff08;Strategy Pattern&#xff09; 工厂模式&#xff08;Factory Pattern&#xff09; 映射表&#xff08;Map&#xff09; 数据驱动设计&#xff08;Data-Driven Design&#xff09; 策略模式&#xff08;Strategy Pattern&#xff09; 将每个条件分…...

24. linux系统基础

两个进程间想通讯&#xff0c;必须要通过内核&#xff0c;今天讲的信号其实本质也是讲进程间通讯的意思&#xff0c;那么你为什么可以在shell环境下&#xff0c;可以和一个进程发kill-9啊&#xff1f; shell是不是相当于一个进程&#xff1f;你自己运行的那个进程是不是也相当于…...

【C++】面试101,二叉搜索树的最近公共祖先,在二叉树中找到两个节点的最近公共祖先,序列化二叉树,重建二叉树,输出二叉树的右视图,组队竞赛,删除公共字符

目录 1.二叉搜索树的最近公共祖先 2.在二叉树中找到两个节点的最近公共祖先 3.序列化二叉树 4.重建二叉树 5.输出二叉树的右视图 6.组队竞赛 7.删除公共字符 1.二叉搜索树的最近公共祖先 这是一个简单的问题&#xff0c;因为是二叉搜索树&#xff08;有序&#xff09;&am…...

Java常见面试题及解答

Java常见面试题及解答1 面向对象的三个特征2 this&#xff0c;super关键字3 基础数据类型4 public、protected、default、private5 接口6 抽象类6.1 抽象类和接口的区别7 重载&#xff08;overload&#xff09;、重写&#xff08;override&#xff09;8 final、finalize、final…...

【Docker】镜像的原理定制化镜像

文章目录镜像是什么UnionFS&#xff08;联合文件系统&#xff09;Docker镜像加载原理制作本地镜像 docker commit -m"提交的描述信息" -a"作者" 容器ID 要创建的目标镜像名:[标签名]案例演示ubuntu安装vim本地镜像发布到阿里云本地镜像发布到阿里云流程将本…...

国内版的ChatGPT弯道超车的机会在哪里?

前言 从去年11月最后一天ChatGPT诞生&#xff0c;截至目前&#xff0c;ChatGPT的热度可谓是爆了。众所周知&#xff0c;ChatGPT是美国“开放人工智能研究中心”研发的聊天机器人程序&#xff0c;它是一个人工智能技术驱动的自然语言处理工具&#xff0c;它能够通过学习和理解人…...

【字符串】

string1.char str[]类型fgets(s,10000,stdin) cin.getline(cin,10000) strlen(str)sizeof 求静态数组长度2.string类型getline(cin,a) cin.getline(cin,10000) str.lenth()str.size()cin 遇到空格就停止3.gets 函数char str[20];gets(str);4.puts 函数puts(str) 相当于 cout<…...

加载驱动之后无法在/dev/下生成vedio0

前言 环境介绍&#xff1a; 1.编译环境 Ubuntu 18.04.5 LTS 2.SDK orangepi Linux 5.4 SDK 3.uboot v2020.04 4.gcc gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf 5.单板 orangepi pc plus 一、问题 继上一篇成功加载gc2035.ko文件之后&#xff0c;理论上…...

Java之类与对象(图文结合)

目录 一、面向对象的初步认知 1、什么是面向对象 2、面向对象与面向过程 二、类定义和使用 1、简单认识类 2、类的定义格式 3、练习 &#xff08;1&#xff09;定义一个狗类 &#xff08;2&#xff09;定义一个学生类 三、类的实例化 1、什么是实例化 2、类和对象的…...

基于 VCS-NLP 的动态低功耗仿真验证介绍

&#x1f525;点击查看精选 IC 技能树系列文章&#x1f525; &#x1f525;点击进入【芯片设计验证】社区&#xff0c;查看更多精彩内容&#x1f525; &#x1f4e2; 声明&#xff1a; &#x1f96d; 作者主页&#xff1a;【MangoPapa的CSDN主页】。⚠️ 本文首发于CSDN&#…...

ESP32-S3 自带usb/jtag初步尝试体验

一、背景 最近在做一台小机器&#xff0c;设备初步规划使用几个实体按钮&#xff0c;这样方便用户戴手套操作。但因为设备有一些需要配置的参数&#xff0c;有需要配备屏幕。但是开发时间比较紧。考虑再三&#xff0c;决定先在初步配备一个简单的控制箱。控制箱上不带屏幕。后…...

前端性能优化总结

前端性能优化是指在设计和开发网站时&#xff0c;采取一些措施来提升网站的性能。这对用户来说是非常重要的&#xff0c;因为高性能的网站可以带来更好的用户体验&#xff0c;同时也有助于提升搜索引擎排名。一、常见前端性能优化措施常见的前端性能优化方法有&#xff1a;压缩…...

React(四) ——hooks的使用

&#x1f9c1;个人主页&#xff1a;个人主页 ✌支持我 &#xff1a;点赞&#x1f44d;收藏&#x1f33c;关注&#x1f9e1; 文章目录⛳React Hooks&#x1f4b8;useState(保存组件状态)&#x1f948;useEffect(处理副作用)&#x1f50b;useCallback&#xff08;记忆函数&#…...

iphone手机热点卡顿多次断连解决办法

文章目录解决方法检查一下几个地方&#xff1a;1.个人热点是否打开2.查看手机是否为4g3.查看手机的最大兼容性开关是否关闭&#xff01;&#xff01;很重要解决方法 检查一下几个地方&#xff1a; 1.个人热点是否打开 这个个人热点容易自动断开&#xff0c;先检查一下是不是…...

设置Typora图床(Github)

PicGo&#xff0c;Github&#xff0c;Typora Nodejs下载&#xff1a; Node.js PicGo下载&#xff1a; GitHub - Molunerfinn/PicGo: A simple & beautiful tool for pictures uploading built by vue-cli-electron-builder 选择downloads或release. 然后进行安装。 Gith…...

jira提交bug规范

一、目的 1&#xff09;方便开发人员根据bug描述快速进行定位问题原因&#xff0c;减少沟通成本。 2&#xff09;规范bug编写&#xff0c;可以提现测试团队的专业性、严谨性。 3&#xff09;可以帮助产品、项目经理及其它人员快速了解bug。 二、说明 本文档主要描述了技术产…...

【数据结构】链表相关题目(中档题)

&#x1f680;write in front&#x1f680; &#x1f4dc;所属专栏&#xff1a;初阶数据结构 &#x1f6f0;️博客主页&#xff1a;睿睿的博客主页 &#x1f6f0;️代码仓库&#xff1a;&#x1f389;VS2022_C语言仓库 &#x1f3a1;您的点赞、关注、收藏、评论&#xff0c;是对…...

小菜鸟Python历险记:(第四集)

今天写的文章是记录我从零开始学习Python的全过程。在Python中函数是非常重要的&#xff0c;这里也可以称为方法。在前面分享的几篇文章中用到的方法有print(),str(),int().这些都是方法&#xff0c;而除了上面写的这几种内置方法以外&#xff0c;我们也可以自己在程序中自定义…...

字符函数和字符串函数【下篇】

文章目录&#x1f396;️1.函数介绍&#x1f4ec;1.8. strstr&#x1f4ec;1.9. strtok&#x1f4ec;1.10. strerror&#x1f4ec;1.11. memcpy&#x1f4ec;1.12. memmove&#x1f4ec;1.13. memcmp&#x1f4ec;1.14. memset&#x1f396;️1.函数介绍 &#x1f4ec;1.8. st…...

【CSS】盒子模型内边距 ② ( 内边距复合写法 | 代码示例 )

文章目录一、内边距复合写法1、语法2、代码示例 - 设置 1 个值3、代码示例 - 设置 2 个值4、代码示例 - 设置 3 个值5、代码示例 - 设置 4 个值一、内边距复合写法 1、语法 盒子模型内边距 可以通过 padding-left 左内边距padding-right 右内边距padding-top 上内边距padding-…...

Beyond Compare许可证获取与激活全攻略

1. Beyond Compare简介与许可证类型解析 Beyond Compare作为一款老牌文件对比工具&#xff0c;已经陪伴开发者走过了20多个年头。我第一次接触它是在2015年做代码合并时&#xff0c;当时就被它直观的三栏式对比界面惊艳到了——左右两侧显示对比内容&#xff0c;中间实时标注差…...

OpenClaw技能市场:10个适配Qwen2.5-VL-7B的实用自动化模块

OpenClaw技能市场&#xff1a;10个适配Qwen2.5-VL-7B的实用自动化模块 1. 为什么需要为Qwen2.5-VL-7B定制技能&#xff1f; 当我第一次在本地部署Qwen2.5-VL-7B这个多模态模型时&#xff0c;最让我惊喜的是它对图像和文本的联合理解能力。但很快我发现一个问题&#xff1a;模…...

OpenClaw定时任务管理:千问3.5-27B驱动日报自动生成

OpenClaw定时任务管理&#xff1a;千问3.5-27B驱动日报自动生成 1. 为什么需要自动化日报 每周五下午&#xff0c;我都会陷入一种"汇报焦虑"——要手动整理GitHub提交记录、汇总JIRA任务进度、编写本周技术总结。这个过程通常要花费1-2小时&#xff0c;而且内容模板…...

OpenClaw多语言支持:Qwen2.5-VL-7B跨语种图文处理技巧

OpenClaw多语言支持&#xff1a;Qwen2.5-VL-7B跨语种图文处理技巧 1. 为什么需要多语言图文处理 上周我收到一份混合了英文技术文档和中文注释的项目资料&#xff0c;需要整理成统一格式的双语对照版本。手动复制粘贴到翻译工具再调整排版&#xff0c;花了我整整三个小时。这…...

Nuki:多芯片组合,覆盖全场景需求

当下“以家庭为中心”的生活趋势&#xff0c;推动了智能家居需求激增&#xff0c;智能门禁作为家庭安全与便捷的核心&#xff0c;却因传统门锁适配性差、智能锁安装繁琐等问题发展受限&#xff0c;设备制造商亟需能简化无线开发、提升能效且满足安全认证的解决方案&#xff0c;…...

OpenClaw飞书机器人实战:Qwen3-32B-Chat私有镜像接入

OpenClaw飞书机器人实战&#xff1a;Qwen3-32B-Chat私有镜像接入 1. 为什么选择OpenClaw飞书本地大模型&#xff1f; 去年我接手了一个小团队的效率工具改造项目&#xff0c;核心需求是"在不泄露内部数据的前提下&#xff0c;实现自动化日报生成和文件归档"。尝试过…...

工业机器人嵌入式系统建模与自动化工具项目三基于RAPID指令的故障排查与项目实施

目录 一、 项目背景与研发目标 1.1 项目研发背景 1.2 项目核心目标 二、 项目全周期进展 2.1 需求分析与环境搭建阶段&#xff08;完成度100%&#xff09; 2.2 核心模块编码开发阶段&#xff08;完成度100%&#xff09; 2.3 功能调试阶段&#xff08;核心故障爆发…...

GLM-4.1V-9B-Base实战教程:跨境电商A+页面图像卖点自动提炼

GLM-4.1V-9B-Base实战教程&#xff1a;跨境电商A页面图像卖点自动提炼 1. 为什么需要自动提炼图像卖点 跨境电商卖家每天需要处理大量商品图片&#xff0c;传统人工标注方式存在三个痛点&#xff1a; 效率低下&#xff1a;一个运营人员每天最多处理50-100张图片成本高昂&…...

ESP32 ILI9341高性能驱动:64字节DMA突发传输优化

1. 项目概述ILI9341_ESP32 是一款专为 ESP32 平台深度优化的 ILI9341 TFT LCD 显示驱动库。其核心设计目标并非简单实现显示功能&#xff0c;而是在硬件能力边界内榨取极致帧率与响应性能。该库直面 ESP32 的 SPI 总线特性——支持 64 字节一次性突发传输&#xff08;burst tra…...

ThingsBoard源码本地部署实战:从环境准备到成功启动的避坑指南

1. 环境准备&#xff1a;打好地基才能盖高楼 第一次在本地部署ThingsBoard源码时&#xff0c;我像大多数开发者一样直接clone代码就往IDE里导&#xff0c;结果被各种依赖问题折腾得够呛。后来才发现&#xff0c;源码部署就像装修房子&#xff0c;水电改造&#xff08;环境配置&…...