最近在做小需求的时候,需要用到目录树,特地写了一个基于java的实现。
由于需求原因,目前只实现了读部分的功能——如何将平面节点build成树。动态新增,删除等功能尚未实现。
目录结构概念:
Node:目录节点,具备节点属性信息
NodeStore:平面目录节点持久化接口,提供方法如下:
public List<T> findByType(String type); -- 根据目录类型,获取该类型下所有的节点(平面节点)
public void add(T node);--将增加节点持久化
public void update(T node);--将修改节点持久化
public void delete(T node);--删除节点
public void move(T src, T target); --将移动节点持久化
NodeStore是一个接口,可以基于DB实现,也可以基于XML实现,或则其他你需要的方式。
Tree:目录树,主要职责:
通过NodeStore load某一类型目录的所有平面节点,build成树;
根据节点id号,查找相应的节点信息
动态新增,修改,删除,移动节点,通过NodeStore将变化持久化;
目录结构实现类图:(目前只实现了读方法)
附上Node,Tree类的核心代码
Node.java
1 public class Node implements Serializable, Comparable<Node> {
2
3 private static final long serialVersionUID = 8085266615416399579L;
4
5 private Integer id; // id号
6 private Integer parentId;// 父亲id号
7 private String name;// 目录名
8 private String description;// 目录描述
9 private String type;// 目录类型
10
11 private Node parent;// 父亲
12 private List<Node> children;// 儿子
13
14 /**
15 * 添加子节点,并且建立与当前节点的父子关系
16 *
17 * @param child 儿子节点
18 */
19 public void addChild(Node child) {
20 if (child == null) {
21 return;
22 }
23 // 设置当前节点为child的父节点
24 child.setParent(this);
25 // 当前节点增加child为儿子节点
26 if (getChildren() == null) {
27 setChildren(new ArrayList<Node>());
28 }
29 getChildren().add(child);
30 }
31
32 /**
33 * 删除子节点,并且建立与当前节点的父子关系
34 *
35 * @param child 儿子节点
36 */
37 public void removeChild(Node child) {
38 if (child == null) {
39 return;
40 }
41 // 将child节点的父节点清空
42 child.setParent(null);
43 if (getChildren() == null) {
44 return;
45 }
46 // 当前节点删除child这个儿子节点
47 getChildren().remove(child);
48 }
49
50 /**
51 * 得到全路径
52 *
53 * @param sep 分隔符号
54 * @return
55 */
56 public String getPathName(String sep) {
57 String pathName = getName();
58 if (getParent() != null) {
59 pathName = getParent().getPathName(sep) + sep + pathName;
60 }
61 return pathName;
62 }
63
64 /**
65 * 判断是否root节点
66 *
67 * @return
68 */
69 public boolean isRootNode() {
70 return getParentId() == -1;
71 }
72
73 /**
74 * 判断是否是叶子节点
75 *
76 * @return
77 */
78 public boolean isEndNode() {
79 return getChildren() == null || getChildren().isEmpty();
80 }
81
82 /**
83 * 对当前节点的儿子节点进行排序
84 */
85 public void sortChildren() {
86 if (isEndNode()) {
87 return;
88 }
89 Collections.sort(getChildren());
90 }
91
92 /**
93 * 对当前节点的所有儿子节点进行排序
94 */
95 public void sortAllChidren() {
96 if (isEndNode()) {
97 return;
98 }
99 List<Node> children = getChildren();
100 Collections.sort(children);
101 for (Node child : children) {
102 child.sortAllChidren();
103 }
104 }
105
106 /**
107 * 将虚拟目录转换成JSONObject对象