背景
原代碼中存在一個switch語句,用于model轉(zhuǎn)VO操作,因為model是抽象類要轉(zhuǎn)成不同的VO原献,所以用了大量的switch語句
AbstractModel model; // 抽象模型
String type=model.getType();
//根據(jù)不同類型轉(zhuǎn)換成視圖對象
switch(type){
case "A":
convertA(model);
case "B":
convertB(model);
.......
case "N":
convertN(model);
}
此類代碼可讀性較差,而且稍有不慎可能會走到下一個case里面蜀铲,引發(fā)錯誤
分析解決方法
使用多態(tài)铝量、策略模式
- 定義convert接口和策略實現(xiàn)
public interface BaseConvert<T extends AbstractModel>{
VO convert(T model);
}
public class ConvertA<A>{
VO convert(A model){ ... 省略};
}
調(diào)用具體策略
Map<String,BaseConvert> map=new HashMap(); // map初始化省略
VO vo=map.get(model.getType()).convert;這種方法的問題是我必須創(chuàng)建大量的類/匿名類
使用函數(shù)式接口Function
- 定義Convert類
public final class Convert{
/** 默認map容量*/
private final static int INIT_MAPPING_CAPACITY = 32;
/** type映射VO轉(zhuǎn)換方法*/
private static final Map<String, Function<AbstractModel, VO>> map;
/**
* 初始化mapping
*/
static {
map=new HashMap<>(INIT_MAPPING_CAPACITY);
// 當類型是A 調(diào)用convertA
map.put("A", (model) ->convertA(model));
map.put("B", (model) ->convertB(model));
.......
map.put("N", (model) ->convertN(model));
}
// 聲明convertA、convertB 略過
/**
* model轉(zhuǎn)VO
* @param model
* @return VO
*/
public static VO dataMappingVO(AbstractModel model) {
return Optional.ofNullable(map.get(model.getType)).orElse((model) -> null).apply(model);
}
}
- 調(diào)用convert
AbstractModel model; // 抽象模型定義省略
VO vo=Convert.dataMappingVO(model);
- 此種方式既不用寫太多的類茬末,可讀性也會更高厂榛。