首页 > 编程语言 >Java嵌套if else优化

Java嵌套if else优化

时间:2023-01-06 14:03:05浏览次数:42  
标签:Java 充值 money else 嵌套 2.2 return public recharge


文章目录

  • ​​1. 传统实现​​
  • ​​2.策略模式+工厂模式+单例模式优化​​
  • ​​2.1 策略接口​​
  • ​​2.2 不同策略实现类​​
  • ​​2.2.1 处理策略一​​
  • ​​2.2.2 处理策略二​​
  • ​​2.2.3 处理策略三​​
  • ​​2.2.4 处理策略四​​
  • ​​3.策略工厂​​
  • ​​4.使用​​
  • ​​5.参考资料​​

多分支复杂条件嵌套判断会让逻辑变得更加复杂,后期难以维护。优化传统的if else 写法,使得业务逻辑更加清晰,后期也便于维护。

1. 传统实现

package demo.replace.ifelse;

/**
* 优化过多 if else 原始业务版本
*
* @author dingwen
* @date 2021/08/15
*/
public class OriginalDemo {
public static void main(String[] args) {
System.out.println("new OriginalDemo().recharge(2000.0) = " + new OriginalDemo().recharge(2000.0));

}


/**
* 充值
*
* @param money 钱
*/
public String recharge(Double money) {
// 优化第一步: 不满足条件优先截断返回
if (money == null) {
return "参数错误,充值金额不能为空";
}

if (money <= 0) {
return "参数错误,充值金额必须大于0";
}

if (money >= 1000) {
return "充值1000 送66天爱奇艺影视VIP";
} else if (money >= 2000) {
return "充值2000以上 送90天爱奇艺影视VIP 两次抽奖机会";
} else if (money >= 5000) {
return "充值5000以上 送半年爱奇艺影视VIP 5次抽奖机会";
} else if (money >= 10000) {
return "充值10000以上 送一年爱奇艺影视VIP 1000元现金奖励 5次抽奖机会";
} else {
return "其他优惠";
}


}

}

2.策略模式+工厂模式+单例模式优化

2.1 策略接口

package demo.replace.ifelse;

/**
* 充电
* 充值接口
*
* @author dingwen
* @date 2021/08/15
*/
public interface Recharge {
/**
* 充值
*
* @param money 钱
* @return {@link String}
*/
String recharge(Double money);
}

2.2 不同策略实现类

2.2.1 处理策略一

package demo.replace.ifelse;

/**
* 充值1000处理
*
* @author dingwen
* @date 2021/08/15
*/
public class OneCharge implements Recharge {
@Override
public String recharge(Double money) {
return "充值1000 送66天爱奇艺影视VIP";
}
}

2.2.2 处理策略二

package demo.replace.ifelse;

/**
* 充值1000处理
*
* @author dingwen
* @date 2021/08/15
*/
public class TwoCharge implements Recharge {
@Override
public String recharge(Double money) {
return "充值2000以上 送90天爱奇艺影视VIP 两次抽奖机会";
}
}

2.2.3 处理策略三

package demo.replace.ifelse;

/**
* 充值1000处理
*
* @author dingwen
* @date 2021/08/15
*/
public class FiveCharge implements Recharge{
@Override
public String recharge(Double money) {
return "充值5000以上 送半年爱奇艺影视VIP 5次抽奖机会";
}
}

2.2.4 处理策略四

package demo.replace.ifelse;

/**
* 充值1000处理
*
* @author dingwen
* @date 2021/08/15
*/
public class TenCharge implements Recharge{
@Override
public String recharge(Double money) {
return "充值10000以上 送一年爱奇艺影视VIP 1000元现金奖励 5次抽奖机会";
}
}

3.策略工厂

package demo.replace.ifelse;

import com.google.common.collect.ImmutableMap;

import java.util.Map;

/**
* 充值处理工厂类
* 策略模式 + 工厂模式 + 单例模式
* @author dingwen
* @date 2021/08/15
*/
public class RechargeFactory {
static Map<String,Recharge> map;

static {
map = ImmutableMap.of(
"1000.0",new OneCharge(),
"2000.0",new TwoCharge(),
"5000.0",new FiveCharge(),
"10000.0",new TenCharge()
);
}


/**
* 单例持有者
*
* @author dingwen
* @date 2021/08/15
*/
public static class SingletonHolder{
public static RechargeFactory rechargeFactory = new RechargeFactory();
}

/**
* 获得实例
*
* @return {@link RechargeFactory}
*/
public static RechargeFactory getInstance(){
return SingletonHolder.rechargeFactory;
}

/**
* 得到充值处理策略
*
* @param money 钱
* @return {@link Recharge}
*/
public Recharge getRecharge(Double money){
return map.get(money.toString());
}


}

4.使用

package demo.replace.ifelse;

import java.util.Optional;

/**
* 优化测试
*
* @author dingwen
* @date 2021/08/15
*/
public class OptimizationTest {
public static void main(String[] args) {
charge(10000.0);
}

public static void charge(Double money){
Recharge recharge = RechargeFactory.getInstance().getRecharge(money);
Optional.ofNullable(recharge).orElseThrow(() -> new RuntimeException("充值处理策略获取异常"));
System.out.println("recharge.recharge(money) = " + recharge.recharge(money));
}
}

5.参考资料

​https://mp.weixin.qq.com/s/pO4_2L-9-MEsN5KI-gFFrQ​


标签:Java,充值,money,else,嵌套,2.2,return,public,recharge
From: https://blog.51cto.com/u_15932195/5993221

相关文章

  • Java8 函数式接口
    文章目录​​一、特点​​​​二、函数式接口中允许定义的方法类型​​​​三、四大内置函数式接口​​​​1.`Consumer`消费​​​​1.1示例​​​​2.`Supplier`供应......
  • java实现微信公众号消息推送
    1.打开[(https://push.ggt1024.com)],微信扫码登录2.点击java生成代码复制3.在pom.xml中添加依赖<dependency><groupId>com.squareup.okhttp3</groupId>......
  • Java中解决lambda表达式内部访问在其外部定义的变量-使用mapToInt
    场景Java8新特性-Stream对集合进行操作的常用API:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/126070657上面介绍Stream的相关使用示例。如果遇到在lam......
  • com.sun.tools.javac.code.TypeTags
    java:java.lang.ExceptionInInitializerErrorcom.sun.tools.javac.code.TypeTags   这个可能原因是你编译器的环境使用过高。但是你的依赖 <dependency>......
  • Java监听器实现原理
    文章目录​​监听器模型​​​​案例实现​​​​`DeveloperListener`​​​​`Developer`​​​​`Event`​​​​`DeveloperListenerImpl`​​​​测试​​监听器就是监听......
  • Day10:学习基础java方法
    方法何谓方法?System.out.println(),那么它是什么呢?Java方法是语句的集合,它们在一起执行一个功能。方法是解决一类问题的步骤的有序组合方法包含于类或对象中方法......
  • (一)Java入门
    java入门1、java跨平台原理:JVM(java虚拟机)2、JRE:包括JVM和运行所要的核心类库JDK:编译工具javac.exe运行工具java.exe(在bin目录下)3、常用DOS命令(1)dir:显示目录(2)cd......
  • Java volatile
    JMM:Java内存模型要想学习volatile,就不得不了解JMM。JVM运行程序的实体是线程,每个线程在被创建时JVM都会为其创建一个自己私有的工作内存。而Java内存模型规定所有的变......
  • Java并发容器之LinkedBlockingQueue源码分析
    一、简介LinkedBlockingQueue是java并发包下一个以单链表实现的阻塞队列,它是线程安全的,至于它是不是有界的,请看下面的分析。二、源码分析2.1属性 //容量private......
  • Java的四种引用方式
    java内存管理分为内存分配和内存回收,都不需要程序员负责,垃圾回收的机制主要是看对象是否有引用指向该对象。java对象的引用包括  强引用,软引用,弱引用,虚引用Java中提供......