策略模式2
接上篇。
做一做就发现问题了:
1、有的时候两个代码块都是插一个表,这样getType()方法返回一个字符串肯定不够了。
2、在解析的时候41个解析块都需要和表里的数据做比较,所以会很频繁的查表,io操作,效率太低。
3、返回值,有时生成违规的表有很多,所以只返回一个Integer就不够了。
一个一个来吧。
第一个问题:
好改,改成字符串数组就OK。
//现在的 @Override public String[] getType() { String[] typeArr = {SERVICE_COMPUTERINFO}; return typeArr; } //原来的 @Override public String getType() { return SERVICE_TYPE; }
前面也需要改动了
//现在的 String[] typeArr = serviceInterfaceEntry.getValue().getType(); for (String type : typeArr) { beanMap.put(type, serviceInterfaceEntry.getValue()); } //原来的 String type = entry.getValue().getType(); beanMap.put(type, serviceInterfaceEntry.getValue());
开始解决第二个问题
本来想用redis把数据缓存起来,但是想想每次字典表的更新都需要同时更新缓存,代码量啊~~工期啊~~~头疼
后来就想在解析文件前,将公用字典表数据,全都放到map里,这样在解析时直接从map里读,避免频繁查表。
如果需要条件查询的。直接用stream的filter,将需要的数据从字典表里过滤出来。
public static final String SET_XX_LIST = "xxList"; if (sCacheMap.get(SET_XX_LIST ) == null) { List<XX> xxList = xxService.getAll(); sCacheMap.put(SET_XX_LIST , xxList ); }
//获取 List<XX> xxList=(List<XX>) sCacheMap.get(XXX); List<XX> xxList = xxList.stream().filter(o -> SPicFile.TABLE_NAME.equals(o.getSetObject()) && "1".equals(o.getIsWeigui())) .collect(Collectors.toList());
解决第三个问题:
将返回值放到map里。
//old Integer returnVal = beanMap.get(beginEndBlockFlag).doAnalysis(param); //new Map<String, Integer> returnMap = beanMap.get(beginEndBlockFlag).doAnalysis(xx); for (String key : returnMap.keySet()) { Integer result = returnMap.get(key) == null ? 0 : returnMap.get(key); int oldValue = resultMap.get(key) == null ? 0 : resultMap.get(key); resultMap.put(key, oldValue + result); }
这样在第一篇里:
@Override public Integer doAnalysis(param) { //do sth; }
解析方法,在做解析的时候,只需要碰到+1的情况就返回1。环境类自动就将对应key的值,更新+1了。
做完感觉在实际项目中,如果有频繁的参数传递,用策略模式,还是工程量有些大,策略模式的场景,尽量是比较封闭的算法块。
仅此做一个尝试吧
欢迎大家加我qq:309620263探讨技术问题。