需求
代码改造:
JSONArray result = new JSONArray();
switch (code) {
case SUBJECT_IFACE_CODE:
for (int i = 0, size = values.size(); i < size; i++) {
JSONObject subject = values.getJSONObject(i);
JSONObject jsonObject = new JSONObject();
jsonObject.put("VALUE4", subject.getString("VALUE4"));
jsonObject.put("VALUE5", subject.getString("VALUE5"));
result.add(jsonObject);
}
break;
case PRODUCT_IFACE_CODE:
for (int i = 0, size = values.size(); i < size; i++) {
JSONObject product = values.getJSONObject(i);
JSONObject jsonObject = new JSONObject();
jsonObject.put("VALUE2", product.getString("VALUE2"));
jsonObject.put("VALUE3", product.getString("VALUE3"));
result.add(jsonObject);
}
break;
default:
result = new JSONArray();
}
工厂+策略模式 消除重复代码
1.由于两段代码中只有两个字段名不一样,所以此处用Map来接收
/**
* FileName: TCCompanyStrategy
* Author: pengyd
* Date: 2019/12/25
* function: 策略模式
*/
public interface TCCompanyStrategy {
Map<String, String> getMap();
String getType();
}
2.新建两个对应的实现类
/**
* FileName: ProductTCCompanyStrategy
* Author: pengyd
* Date: 2019/12/25
* function: 产品段
*/
public class ProductTCCompanyStrategy implements TCCompanyStrategy {
@Override
public Map<String, String> getMap() {
Map<String, String> map = Maps.newHashMap();
map.put("code", "VALUE2");
map.put("desc", "VALUE3");
return map;
}
@Override
public String getType() {
return TCCompanyHandler.PRODUCT_IFACE_CODE;
}
}
/**
* FileName: SubjectTCCompanyStrategy
* Author: pengyd
* Date: 2019/12/25
* function: 科目段
*/
public class SubjectTCCompanyStrategy implements TCCompanyStrategy {
@Override
public Map<String, String> getMap() {
Map<String, String> map = Maps.newHashMap();
map.put("code", "VALUE4");
map.put("desc", "VALUE5");
return map;
}
@Override
public String getType() {
return TCCompanyHandler.SUBJECT_IFACE_CODE;
}
}
3.画重点 :新建工厂类来处理
/**
* FileName: StrategyFactory
* Author: pengyd
* Date: 2019/12/25
* function: 策略工厂
*/
public class StrategyFactory {
private Map<String, TCCompanyStrategy> map;
public StrategyFactory() {
List<TCCompanyStrategy> strategies = Lists.newArrayList();
strategies.add(new SubjectTCCompanyStrategy());
strategies.add(new ProductTCCompanyStrategy());
map = strategies.stream().collect(Collectors.toMap(TCCompanyStrategy::getType, tcCompanyStrategy -> tcCompanyStrategy));
}
public static class Holder {
public static StrategyFactory instance = new StrategyFactory();
}
public static StrategyFactory getInstance() {
return Holder.instance;
}
public TCCompanyStrategy get(String type) {
return map.get(type);
}
}
最后使用效果
JSONArray result = new JSONArray();
//开始组装数据
TCCompanyStrategy tcCompanyStrategy = StrategyFactory.getInstance().get(code);
if (Objects.isNull(tcCompanyStrategy)) {
throw new IllegalArgumentException("please check your code");
}
Map<String, String> map = tcCompanyStrategy.getMap();
for (int i = 0, size = values.size(); i < size; i++) {
JSONObject subject = values.getJSONObject(i);
JSONObject jsonObject = new JSONObject();
jsonObject.put(map.get("code"), subject.getString(map.get("code")));
jsonObject.put(map.get("desc"), subject.getString(map.get("desc")));
result.add(jsonObject);
}
后面再增加类似的接口,只需要实现TCCompanyStrategy即可。
再也不用看到一大堆if-else/switch-case了