优雅摆脱冗长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
Post a Comment