测试代码
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 哥们,你返回的属性不够用啊前两点比较容易想到,也比较容易实现,但这时候前端同学抛来了新的问题,哥们,你返回的树节点属性不够用啊,你看我这界面。需要备注你没返回来啊。
好吧,这种情况确实没考虑到。
要满足上述需求,简单做法就将remark属性直接添加到 TreeNode 类中,Convert中赋下值,这不就满足了,但想想又不对,今天这个前端伙计缺个remark,明天可能别的伙计又缺个其他属性,全加到TreeNode中,TreeNode到底是树节点还是业务实体,所以不能这么搞。
这里要处理成可扩展,同时满足开闭原则,所以此处比较妥的处理方式是继承,TreeNode属性满足不了的情况下,通过继承扩展具体业务的树节点来实现。
具体改造点如下
1 新增菜单实体扩展树节点如下
public class MenuEntityTreeNode extends TreeNode {// 扩展备注属性
private String remark;
// 省略set get ...
}