1 表驱动概念:
表驱动方法是一种方案:通过索引在表中查找对应的处理action来替换替复杂的逻辑语句(if和 case);在简单情况下,逻辑语句更容易,更直接。随着逻辑链变得越来越多,越来越长,表驱动模式就变得越来越有吸引力。
其实我们平时用的平时用的的HashMap,二维数组就是一种表驱动的思想,只是我们大多时候的在HashMap或2维数组中存储的value是具体的数据。
其实hashmap里也可以存指令。
2: 表驱动示例:
场景:由于历史原因,我们的部门人员接口返回值字段发生了变化,但是对应的数据库中的表都是一样的
所以我们需要做适配。
既:如果返回值key 是 dept 就查询 dept_id, 如果是dept_info 我们就查询id
如果返回值key 是 user 就查询 user_id, 如果是user_info 我们就查询id
第一版本:if else
JSONObject json = getInfo();
if (json.containsKey("dept")) {
String id = json.getString("dept_id");
Department d = DepartmentDAO.getDeptInfo(id);
}
if (json.containsKey("dept_info")) {
String id = json.getString("id");
Department d = DepartmentDAO.getDeptInfo(id);
}
if (json.containsKey("user")) {
String id = json.getString("user_id");
User u = UserDAO.getUserInfo(id);
}
if (json.containsKey("user_info")) {
String id = json.getString("id");
User u = UserDAO.getUserInfo(id);
}
如果后面继续添加接口,新增历史版本,这样的代码结构变的很难维护并且可读性会越来越差。
修改为表驱动 + lambda方式
/**
* 自定义ID,处理映射表
*/
private HashMap<String, Function<JSONObject, String>> getCustomId = new HashMap<String, Function<JSONObject, String>>(){
{
put("dept", (T) -> DepartmentDAO.getDeptInfo(T.getString("dept_id")));
put("dept_info", (T) -> DepartmentDAO.getDeptInfo(T.getString("id")));
put("user", (T) -> UserDAO.getUserInfo(T.getString("user_id")));
put("user_info", (T) -> UserDAO.getUserInfo(T.getString("id")));
}
};
public void fillID2Result(JSONObject result) {
getCustomId.keySet().stream().forEach(key -> {
if (result.getJSONObject("data").containsKey(key)) {
String cid = getCustomId.get(key).apply(result.getJSONObject("data").getJSONObject(key));
result.getJSONObject("data").getJSONObject(key).put(customId, cid);
}
});
}
}
这样修改完成后,以后需要新增if 分支就只需要在hashmap中添加一条新的数据就ok 了。对于调用只需要传入参数即可,可以达到代码的解耦合