表驱动模式 + Lambda 方式替换大量IF 语句操作

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 了。对于调用只需要传入参数即可,可以达到代码的解耦合

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。