文章目录
- 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