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

当if else比较多时候应该怎么避免?

当代码中出现大量 if-else 分支时,不仅可读性和可维护性变差,还容易引发逻辑错误。为了解决这个问题,可以采用以下几种 替代方案


✅ 1. 使用策略模式(Strategy Pattern)

适合:分支是“行为”的不同实现。

public interface DiscountStrategy {double calculatePrice(double price);
}public class VipDiscount implements DiscountStrategy {public double calculatePrice(double price) {return price * 0.8;}
}public class NormalDiscount implements DiscountStrategy {public double calculatePrice(double price) {return price;}
}
public class PriceCalculator {private static final Map<String, DiscountStrategy> strategyMap = Map.of("VIP", new VipDiscount(),"NORMAL", new NormalDiscount());public double calculate(String userType, double price) {return strategyMap.getOrDefault(userType, new NormalDiscount()).calculatePrice(price);}
}

✅ 2. 使用 Map + 函数式接口(推荐 Java 8+)

适合:简单的逻辑映射。

Map<String, Runnable> actionMap = new HashMap<>();
actionMap.put("A", () -> System.out.println("执行 A"));
actionMap.put("B", () -> System.out.println("执行 B"));String type = "A";
actionMap.getOrDefault(type, () -> System.out.println("默认操作")).run();

✅ 3. 枚举 + 多态

📌 适用场景:
  • 条件分支基于有限个明确的状态值(如订单状态、角色类型等)。
  • 每个状态对应一个明确的行为逻辑。
✅ 示例:订单状态处理
public enum OrderStatus {NEW {@Overridepublic void handle() {System.out.println("处理新订单逻辑");}},PAID {@Overridepublic void handle() {System.out.println("处理已支付订单逻辑");}},SHIPPED {@Overridepublic void handle() {System.out.println("处理已发货订单逻辑");}};public abstract void handle();
}
🧠 使用方式:
public class OrderService {public void process(OrderStatus status) {status.handle();}
}

✅ 优点:
  • 避免冗长的 if-else
  • 新增状态只需新增一个枚举项,不改原代码,符合开闭原则
  • 每个状态的行为直接定义在枚举里,聚合了状态与行为,代码更清晰。
❗注意事项:
  • 不适用于状态行为较复杂或状态不确定的场景。
  • 枚举内部代码不要太复杂,保持简洁。

✅ 4. 使用工厂模式(Factory Pattern)

适合:根据条件返回不同对象的场景。

public interface Handler {void handle();
}public class TypeAHandler implements Handler {public void handle() {System.out.println("处理A类型");}
}
public class HandlerFactory {private static final Map<String, Handler> map = Map.of("A", new TypeAHandler()// add more);public static Handler getHandler(String type) {return map.get(type);}
}

✅ 5. 使用责任链模式(Chain of Responsibility)

📌 适用场景:
  • 多个判断条件需要依次执行,类似流水线。
  • 每个处理逻辑可以选择“处理或不处理”,并交给下一个。
  • 比如日志过滤、请求校验、审批流程。

✅ 类图结构(简化):
Handler(抽象处理者)├── setNext(Handler)└── handle(Request)↓ConcreteHandlerA
ConcreteHandlerB
...

✅ 示例:审批流程
public abstract class Approver {protected Approver next;public void setNext(Approver next) {this.next = next;}public abstract void approve(int amount);
}
public class Manager extends Approver {public void approve(int amount) {if (amount <= 1000) {System.out.println("Manager approved " + amount);} else if (next != null) {next.approve(amount);}}
}public class Director extends Approver {public void approve(int amount) {if (amount <= 5000) {System.out.println("Director approved " + amount);} else if (next != null) {next.approve(amount);}}
}
// 使用:
Approver manager = new Manager();
Approver director = new Director();
manager.setNext(director);manager.approve(800);   // Manager approved
manager.approve(3000);  // Director approved

✅ 优点:
  • 解耦请求与处理者,请求发出者不关心处理逻辑。
  • 易于扩展,新增处理者只需加一环节。
  • 逻辑清晰,便于流程控制(可以中止传递)。
❗注意事项:
  • 如果链过长,性能会受影响
  • 某些环节不处理也不传递,会造成请求丢失,要小心设计。

✅ 6. 表驱动法(适用于数学或规则匹配)

适合:根据输入查表返回结果(用二维数组或 Map)。


🛑 不推荐做法(陷阱)

if (type.equals("A")) { ... }
else if (type.equals("B")) { ... }
// 太多时会越来越难维护

✅ 总结:选型建议

适用场景推荐方案
行为多变,结构清晰策略模式、责任链模式
简单条件分支Map + Lambda
固定类型对应行为枚举 + 多态
条件逻辑可抽象成对象工厂工厂模式
条件判断涉及顺序或权限依赖责任链模式

我们来详细讲讲你感兴趣的两种方法:枚举 + 多态责任链模式。这两种都是在“if-else太多”时非常实用的重构技巧,各有适用场景。

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

相关文章:

  • MCP与企业数据集成:ERP、CRM、数据仓库的统一接入
  • #Linux权限管理:从“Permission denied“到系统安全大师
  • uniapp自定义圆形勾选框和全选框
  • iOS 抓包工具有哪些?2025实用指南与场景推荐
  • 重磅发布:Oracle ADG 一键自动化搭建脚本
  • 离线快速处理PDF格式转化的方案
  • 揭秘ThreadLocal核心原理与应用
  • Linux文件系统理解1
  • NLP自然语言处理的一些疑点整理
  • vue2的scoped 原理
  • 基于SpringBoot+MyBatis+MySQL+VUE实现的实习管理系统(附源码+数据库+毕业论文+项目部署视频教程+项目所需软件工具)
  • Python通关秘籍(五)数据结构——元组
  • linux 驱动 - v4l2 驱动框架
  • Linux 重定向和缓冲区
  • docker-desktop启动失败
  • leetcode 1695. 删除子数组的最大得分 中等
  • importlib.import_module() 的用法与实战案例
  • MySQL 学习一 存储结构和log
  • HTML结构解析
  • SpringAOP的实现原理和场景
  • SQLAlchemy 2.0简单使用
  • c++day05(ASCII)
  • 性能测试-从0到1搭建性能测试环境Jmeter+Grafana+influxDB+Prometheus+Linux
  • “鱼书”深度学习入门 笔记(1)前四章内容
  • torchvision.transforms 与 MONAI 数据增强的异同
  • C# 类 封装 属性 练习题
  • RabbitMQ-交换机(Exchange)
  • Ajax第一天
  • 美团视觉算法面试30问全景精解
  • freertos关键函数理解 uxListRemove