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

2 改造TreeUtil.build方法参数,新增TreeNode Class类型参数,如下

/**
 * 树构建
 */

public static <T,E extends TreeNode> List<E> build(List<T> list,Object parentId,Class<EtreeNodeClass,Convert<T,Econvert){
    List<E> treeNodes = CollectionUtil.newArrayList();
    for(T obj : list){
        E treeNode = (E)ReflectUtil.newInstance(treeNodeClass);
        convert.convert(obj, treeNode);
        treeNodes.add(treeNode);
    }

    List<E> finalTreeNodes = CollectionUtil.newArrayList();
    for(E treeNode : treeNodes){
        if(parentId.equals(treeNode.getParentId())){
            finalTreeNodes.add((E)treeNode);
            innerBuild(treeNodes,treeNode);
        }
    }
    return finalTreeNodes;
}
测试代码 public static void main(String[] args{
    // ...此处省略模拟数据创建过程

    // 2、树结构构建
    List<MenuEntityTreeNode> treeStructureNodes = TreeUtil_3_0.build(menuEntityList, "0",MenuEntityTreeNode.class,new TreeUtil_3_0.Convert<MenuEntity,MenuEntityTreeNode>(){

        @Override
        public void convert(MenuEntity object, MenuEntityTreeNode treeNode
{
            treeNode.setId(object.getId());
            treeNode.setParentId(object.getPid());
            treeNode.setCode(object.getCode());
            treeNode.setName(object.getName());
            treeNode.setLinkUrl(object.getUrl());
            // 新增的业务属性
            treeNode.setRemark("添加备注属性");
        }
    });
   Console.log(JSONUtil.formatJsonStr(JSONUtil.toJsonStr(treeStructureNodes)));
}

如此一来,不同业务场景下需要添加不同的属性时,即可做到可扩展,且对现有代码不造成任何影响和改动。

4.0 哥们,我的属性名不叫code

完成了3.0版本,基本上大部分需求就都可以满足了,但是这时候前端同学又抛来了新的问题,哥们,你返回的树节点编号属性是code,但我这边的叫number,对应不上,我这边调整的话影响比较大,你看后端返回的时候能不能处理下。

code属性名肯定是不能调整的,因为其他模块树的节点编号都叫code。

那怎么办 ?其实也简单,跟3.0版本一样,在扩展的业务树节点去加个属性,这样问题是解决了,但万一出现所有treeNode的属性名都跟前端需要的不对应这种极端情况,那意味着所有树属性都需要自行扩展定义,这种岂不是返回了没什么用的父TreeNode心中的所有属性。序列化时倒是可以控制,为空的不进行序列化,但不是依赖序列化框架了么。还有没有其他办法。

稍微整理下需求,就是树节点属性在返回前端时要能够支持自定义属性名

类属性定义好就改不了了,怎么自定义,除了新增类和改现有的属性,还有什么办法呢 ?这时候我们应该想到map

具体怎么做

1 首先,定义新的类TreeNodeMap,看名字就知道基于map实现

public class TreeNodeMap extends HashMap {

    private TreeNodeConfig treeNodeConfig;

    public TreeNodeMap(){
        this.treeNodeConfig = TreeNodeConfig.getDefaultConfig();
    }

    public TreeNodeMap(TreeNodeConfig treeNodeConfig){
        this.treeNodeConfig = treeNodeConfig;
    }

    public <T> getId() {
        return (T)super.get(treeNodeConfig.getIdKey());
    }

    public void setId(String id) {
        super.put(treeNodeConfig.getIdKey(), id);
    }

    public <T> getParentId() {
        return (T)super.get(treeNodeConfig.getParentIdKey());
    }

    public void setParentId(String parentId) {
        super.put(treeNodeConfig.getParentIdKey(), parentId);
    }

    public <T> getName() {
        return (T)super.get(treeNodeConfig.getNameKey());
    }

    public void setName(String name) {
        super.put(treeNodeConfig.getNameKey(), name);
    }

    public <T> T  getCode() {
        return (T)super.get(treeNodeConfig.getCodeKey());
    }

    public TreeNodeMap setCode(String code) {
        super.put(treeNodeConfig.getCodeKey(), code);
        return this;
    }

    public List<TreeNodeMap> getChildren() {
        return (List<TreeNodeMap>)super.get(treeNodeConfig.getChildrenKey());
    }

    public void setChildren(List<TreeNodeMap> children) {
        super.put(treeNodeConfig.getChildrenKey(),children);
    }

    public void extra(String key,Object value){
        super.put(key,value);
    }
}

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

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