突破CRUD | 万能树工具类封装 (4)

测试代码

public static void main(String[] args{
    // 1、模拟菜单数据
    List<MenuEntity> menuEntityList = CollectionUtil.newArrayList();
    menuEntityList.add(new MenuEntity("1","0","系统管理","sys","/sys"));
    menuEntityList.add(new MenuEntity("11","1","用户管理","user","/sys/user"));
    menuEntityList.add(new MenuEntity("111","11","用户添加","userAdd","/sys/user/add"));
    menuEntityList.add(new MenuEntity("2","0","店铺管理","store","/store"));
    menuEntityList.add(new MenuEntity("21","2","商品管理","shop","/shop"));

    // 2、树结构构建
    List<TreeNode> treeStructureNodes = TreeUtil_1_0.build(menuEntityList, "0"new Convert<MenuEntity, TreeNode>() {
        @Override
        public void convert(MenuEntity menuEntity, TreeNode treeNode
{
            treeNode.setId(menuEntity.getId());
            treeNode.setParentId(menuEntity.getPid());
            treeNode.setCode(menuEntity.getCode());
            treeNode.setName(menuEntity.getName());
            treeNode.setLinkUrl(menuEntity.getUrl());
        }
    });
    Console.log(JSONUtil.formatJsonStr(JSONUtil.toJsonStr(treeStructureNodes)));
}

比较1.0与初版的测试代码,发现少了树节点列表构建的过程,属性拷贝的工作作为回调过程在转换过程中进行处理。

2.0 仅支持造菜单树哪够

1.0优化完后,我们来了新的需求,有个机构树也需要生成,此时的树工具仅支持了菜单树,所以我们进行改造,让其支持其他任何对象的树生成。

改造点主要是将的TreeUtil中的菜单实体转换为泛型,限于篇幅,就贴个核心方法的代码

public static <T> List<TreeNode> build(List<T> list,Object parentId,Convert<T,TreeNode> convert){
    List<TreeNode> treeNodes = CollectionUtil.newArrayList();
    for(T obj : list){
        TreeNode treeNode = new TreeNode();
        convert.convert(obj,treeNode);
        treeNodes.add(treeNode);
    }

    List<TreeNode> finalTreeNodes = CollectionUtil.newArrayList();
    for(TreeNode treeNode : treeNodes){
        if(parentId.equals(treeNode.getParentId())){
            finalTreeNodes.add(treeNode);
            innerBuild(treeNodes,treeNode);
        }
    }
    return finalTreeNodes;
}

如此一来,我们就可以支持任意类型的树构造。

3.0 哥们,你返回的属性不够用啊

前两点比较容易想到,也比较容易实现,但这时候前端同学抛来了新的问题,哥们,你返回的树节点属性不够用啊,你看我这界面。需要备注你没返回来啊。

突破CRUD | 万能树工具类封装

好吧,这种情况确实没考虑到。

要满足上述需求,简单做法就将remark属性直接添加到 TreeNode 类中,Convert中赋下值,这不就满足了,但想想又不对,今天这个前端伙计缺个remark,明天可能别的伙计又缺个其他属性,全加到TreeNode中,TreeNode到底是树节点还是业务实体,所以不能这么搞。

这里要处理成可扩展,同时满足开闭原则,所以此处比较妥的处理方式是继承,TreeNode属性满足不了的情况下,通过继承扩展具体业务的树节点来实现。

具体改造点如下

1 新增菜单实体扩展树节点如下

public class MenuEntityTreeNode extends TreeNode {
    // 扩展备注属性
    private String remark;
    // 省略set get ...

}

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zywgfj.html