优雅摆脱冗长if-else:轻量级策略模式在Java中的简明实践

当处理日常工作中频繁出现的if-else逻辑时,过多嵌套的条件语句会使代码难以阅读。虽然策略模式是消除if语句的一种有效方式,但其实现方式通常较为繁琐。在这里提供了一种轻量级的替代方案:通过使用Map数据结构实现策略模式,从而简化代码,减少if语句的使用

下面直接上代码。分别使用if与策略模式代码:

import com.google.common.collect.ImmutableMap;
import lombok.AllArgsConstructor;
import lombok.Data;

import java.util.function.Function;

/**
* 宠物回家
* 使用if-else逻辑和轻量级策略模式(基于MAP数据结构)的比较。
* <p>
*
* @author James Smith
*/
public class StrategyPatternDemo {

public static void main(String[] args) {
Pet cat = new Pet(1, "汤姆猫");
Pet hamster = new Pet(2, "杰瑞仓鼠");
Pet bird = new Pet(3, "杰克鸟");

new StrategyPatternDemo().goHomeWithStrategyPattern(cat); // 返回 "汤姆猫回家"
new StrategyPatternDemo().goHomeWithIfElse(cat); // 返回 "汤姆猫回家"
}

/**
* 使用if-else逻辑确定宠物如何回家。
*/
private void goHomeWithIfElse(Pet pet) {
if (pet.getType() == 1) {
System.out.println(pet.getName() + " 回家");
} else if (pet.getType() == 2) {
System.out.println(pet.getName() + " 飞回家");
} else if (pet.getType() == 3) {
System.out.println(pet.getName() + " 跑回家");
}
}

/**
* 使用轻量级策略模式和MAP数据结构确定宠物如何回家。
*/
private void goHomeWithStrategyPattern(Pet pet) {
ImmutableMap<Integer, Function<Pet, String>> strategyMap = ImmutableMap.of(
1, p -> p.getName() + " 回家",
2, p -> p.getName() + " 飞回家",
3, p -> p.getName() + " 跑回家"
);

Function<Pet, String> strategy = strategyMap.get(pet.getType());
System.out.println(strategy.apply(pet));
}

@Data
@AllArgsConstructor
private static class Pet {
/**
* 1-2-3-仓鼠
*/
private Integer type;
private String name;
}
}

goHomeWithIfElse()使用if实现。而goHomeWithStrategyPattern()基于策略模式,一些关键点的解释

  •  ImmutableMap为Google guava包的方法,此处用于快速构建一个不可变的map数据结构

  •  ImmutableMap<Integer, Function<Pet, String>>中map的value的泛型是一个Function<Pet, String>,代表入参为Pet对象,返回为一个String。不懂Function<Pet, String>的看下面的Function Demo,懂得跳过:
    • Function<Integer,Integer> function = t -> t + 1;
      int i = function.apply(1);
      int j = function.apply(2);
      int k = function.apply(3);
      System.out.println("i=" + i + ",j=" + j + ",k=" + k); // i=2,j=3,k=4

                    上面demo中,apply()方法代表执行 t + 1; 代码块。而t -> t + 1; 中的t则是apply()方法的入参。

  • 调用map.get(pet.getType()),获取到map中key为1的value。p -> p.getName() + " go home",该代码块(该代码块需要后续调用apply(pet)方法才会执行)可以理解为以下代码块:
    • Function<Pet, String> function = p -> {
      return p.getName() + " go home";
      };
  • 调用 function.apply(pet) 方法,运行 p.getName() + " go home" 并返回结果。

Comments

Popular posts from this blog

CompletableFuture 异常处理实践:避免线程池耗尽

Spring 内部调用,事务真会失效吗?