当前位置: 首页 > 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)); // 抛出异常}
}

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

http://www.lryc.cn/news/41324.html

相关文章:

  • 24. linux系统基础
  • 【C++】面试101,二叉搜索树的最近公共祖先,在二叉树中找到两个节点的最近公共祖先,序列化二叉树,重建二叉树,输出二叉树的右视图,组队竞赛,删除公共字符
  • Java常见面试题及解答
  • 【Docker】镜像的原理定制化镜像
  • 国内版的ChatGPT弯道超车的机会在哪里?
  • 【字符串】
  • 加载驱动之后无法在/dev/下生成vedio0
  • Java之类与对象(图文结合)
  • 基于 VCS-NLP 的动态低功耗仿真验证介绍
  • ESP32-S3 自带usb/jtag初步尝试体验
  • 前端性能优化总结
  • React(四) ——hooks的使用
  • iphone手机热点卡顿多次断连解决办法
  • 设置Typora图床(Github)
  • jira提交bug规范
  • 【数据结构】链表相关题目(中档题)
  • 小菜鸟Python历险记:(第四集)
  • 字符函数和字符串函数【下篇】
  • 【CSS】盒子模型内边距 ② ( 内边距复合写法 | 代码示例 )
  • uni-app ——使用uploadFile上传多张图片
  • Linux - 进程控制(进程等待)
  • Python 可视化最频繁使用的10大工具
  • Windows与Linux端口占用、查看的方法总结
  • 48天强训 Day1 JavaOj
  • 崩溃的一瞬间
  • 13回归网络:HTTP/2是怎样的网络协议?
  • CSS学习笔记——基础选择器,字体属性,文本属性,三种样式表
  • 第十四届蓝桥杯三月真题刷题训练——第 16 天
  • 鸟哥的Linux私房菜 Shell脚本
  • FPGA基于RIFFA实现PCIE采集ov5640图像传输,提供工程源码和QT上位机