2 改造TreeUtil.build方法参数,新增TreeNode Class类型参数,如下
/*** 树构建
*/
public static <T,E extends TreeNode> List<E> build(List<T> list,Object parentId,Class<E> treeNodeClass,Convert<T,E> convert){
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> T getId() {
return (T)super.get(treeNodeConfig.getIdKey());
}
public void setId(String id) {
super.put(treeNodeConfig.getIdKey(), id);
}
public <T> T getParentId() {
return (T)super.get(treeNodeConfig.getParentIdKey());
}
public void setParentId(String parentId) {
super.put(treeNodeConfig.getParentIdKey(), parentId);
}
public <T> 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);
}
}