程序开发中经常会用到树型结构,如组织机构·菜单·角色(支持继承的角色)·分目录的参数管理。
下面是我的一段经历,来单位不久我被分配到一个客服平台开发的项目中,由一位‘资深’项目经理带着做,他已经有五到六年的工作经验
了,不过在后来的工作中发现,他这六年是ctrl+c,ctrl+v过来的。
切入正题,我负责的模块中有一个是知识库的建立与应用,它的需求是这样的,要有一个目录,目录里有子目录,共要求三级目录,目录下
面对应着的是一些业务知识点供客服人员查看。
之前我没有用过树型结构,在这个程序里他们有写好的树型结构的读取工具,我看了看,大致如下做法是在后台组织一个html,然后发送到
前台再用js工具进行格式化成树的模样,具体操作是读很多次数据库数据,如果有三级就先读取一级结点,然后读取二级结点,再读取三级
结点。采用的是深度优先的做法把数据读取出来,在读取的时候组装html。
我看了以后头很大,因为我想用他们现有的模式去做,心里会很不舒服:
他们的做法有很多不足
1.在组装树型结构的时候会查询多次数据库,而且随着结点数目的增长,查询次数也随之增长很多。
2.不便于调试,有了问题很难发现。
3.不便于数据缓存。
4.增加网络流量。
5.针对一个js树型工具组装的html,如果换成其他的js工具几乎是不可能的。
6.代码没有可重用性,它把业务数据库与组装html混合在一起。
7.如果数据库数据出现循环引用,会在死循环里出不来,还有可能导致系统崩溃。
....
为了解决上述问题,我自己写了一个简单的树型结构加载工具,经历过数次的重构,在三个项目中使用。
定义一个结点类型:Node<T> 代码如下:
package com.**.power.tool.tree.node;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
public class Node<T> implements Serializable ,Comparable{
private static final long serialVersionUID = -8658937456797684778L;
private Node<T> parent; //父结点
private List<Node<T>> children; //子结点
private String id; //结点编号
private String text; //结点标签
private String parentId; //父结点编号
private int grade; //结点级别 根结点为0
private int subLevels; //结点下面最深有多少层
private boolean isexpand=false; //结点展开状态
public Node(){}
public Node(T t) {
this.extend=t;
}
//
private T extend; //扩展属性 用于扩展业务属性与指定的业务实体进行扩展
//....这里省去get set方法
@SuppressWarnings("unchecked")
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (super.equals(obj)) {
return true;
}
if (!(obj instanceof Node)) {
return false;
}
Node<T> target = (Node<T>) obj;
if (target.getId() == null) {
return false;
}
if (target.hashCode()==hashCode()) {
return true;
}
return false;
}
@Override
public int compareTo(Object o) {
if (o instanceof Node ) {
Node tmp=(Node) o;
Object ext=tmp.getExtend();
if (ext!=null&&this.getExtend()!=null) {
if (ext instanceof Comparable&&this.getExtend() instanceof Comparable) {
Comparable extcomp=(Comparable)this.extend;
Comparable tmpcomp=(Comparable)tmp.getExtend();
int i= tmpcomp.compareTo(extcomp);
System.out.println(i);
return i;
}
}
}
return 0;
}
}
从注释上可以看出以下几点:
1.它是一个泛型类型
2.业务无关
3.有可扩展属性
4.实现了Comparable接口,从而实现对结点进行排序
这个从接口实现上可以看出,先去查看它的扩展属性是不是实现了Comparable,如果实现了就用扩展属性进行比较,如果没有实现,就不进行比较返回0,表示相等以免对结点不必要的移动。
5.它有grade级别和subLevels下面最多有多少层,以便判断是不是对该结点进行相关操作。
这篇博客到此吧,下次再说如果组装树型结构。
谢谢大家来捧场!!
欢迎留言讨论!
分享到:
相关推荐
PC间用ACL和TRP协议
基于西门子S7-1200PLC的立体车库创新设计:融入新能源汽车充电元素,简约而不简单的智能化方案,基于西门子S7-1200PLC的立体车库设计设计 针对古老传统的立体车库进行创新,引入当下流行的新能源汽车充电元素,简约而不简单 包含:程序,图纸,仿真 ,关键词:基于西门子S7-1200PLC; 立体车库设计; 创新; 新能源汽车充电元素; 简约设计; 程序; 图纸; 仿真。,基于新能源充电的西门子S7-1200PLC立体车库创新设计:程序、图纸与仿真,简约而不凡
陕西省国家级非物质文化遗产经纬度数据统计表 统计内容包含以下字段: 1. 项目名称 2. 遗产类别 3. 入选批次 4. 所属地区 5. 申报地区/单位 6. 保护单位 7. 地理经度 8. 地理纬度 该统计表系统记录了陕西省国家级非物质文化遗产的地理空间信息,为文化遗产的数字化保护与研究工作提供了重要的数据支撑。
GBT27023复习备考
vivado MIPS32五级流水CPU设计
基于MBD开发手册的《Application Modeling Guideline:辅助驾驶系统中的数学模型设计与应用》,Application Modeling Guideline 文档57页 基于MBD开发手册包含: 1. MBD概述:文档可能会介绍MBD的基本概念,解释为什么它在辅助驾驶系统开发中至关重要。 MBD允许工程师使用数学模型来描述系统行为,这有助于早期发现问题,减少硬件原型制作的需求。 2. 工具选择:在辅助驾驶开发中,常用的MBD工具有MATLAB Simulink、MathWorks的Simulink Design Verifier、Vector的CANoe等。 文档可能涵盖这些工具的特点和适用场景,帮助开发者选择合适的工具。 3. 模型设计:MBD的核心是模型设计,文档会详细说明如何创建和组织模型结构,包括输入 输出接口定义、状态机设计、算法实现等。 对于辅助驾驶系统,这可能涉及到视觉处理、传感器融合、路径规划、决策制定等多个模块。 4. 仿真与验证:MBD工具支持动态仿真,开发者可以运行模型以验证其功能。 文档会介绍如何设置仿真条件,进行时序分析,以及如
LabVIEW曲线处理与包络线判断功能:准确判断,附带Demo及完整源码,labview做的曲线处理,包络线判断功能,判断准确。 一个demo,有源码 ,Labview曲线处理; 包络线判断功能; 判断准确; 有源码Demo; 包络线功能Demo; 准确度。,LabVIEW曲线处理与包络线精准判断功能Demo源码分享
2021年06月Scratch三级实操
GBT27067复习备考
基于nRF905的实验室温湿度监测系统研究.pdf
2022年12月机器人六级理论
Unity Shader Graph 2D - 角色身上部件高亮Bloom效果
大四-校内实习第四天(五)
2020年09月机器人五级实操
springboot停车场管理系统,含有完整的源码和报告文档
基于MPC模型预测算法的轨迹跟踪控制研究:双仿真比较及侧偏角软约束的重要性分析,基于mpc模型预测轨迹跟踪控制,总共包含两套仿真,一套是不加入四轮侧偏角软约束,一套是加入四轮侧偏角的软约束控制,通过carsim与simulink联合仿真发现加入侧偏角软约束在进行轨迹跟踪时,能够通过控制四轮侧偏角的变化,较好的实现轨迹跟踪;而不加入侧偏角软约束的,发现车辆由于失去稳定性, 轨迹跟踪失败( 该仿真是学习mpc模型预测算法控制和基于车辆动力学轨迹跟踪控制非常好的学习资料)。 文件中参考文献和文件说明。 ,基于mpc模型预测轨迹跟踪控制; 四轮侧偏角软约束; 车辆稳定性; 轨迹跟踪失败; carsim与simulink联合仿真; mpc模型预测算法控制; 车辆动力学轨迹跟踪控制。,MPC模型预测轨迹跟踪控制:侧偏角软约束与车辆稳定性的联合仿真研究
基于扩展卡尔曼滤波算法的车辆多状态精确估计与仿真研究:融合位置、轨迹、速度及加速度的实时动态监测,基于扩展卡尔曼滤波EKF的车辆状态估计 估计的状态包括: 1. 车辆的横纵向位置 2.车辆行驶轨迹、横摆角、 3. 车速、加速度、横摆角速度 4. 相应的估计偏差。 内容附带:Simulink模型与MATLAB代马,以及参考文档。 ,基于扩展卡尔曼滤波; 车辆状态估计; 横纵向位置估计; 行驶轨迹估计; 横摆角估计; 车速估计; 加速度估计; 横摆角速度估计; 估计偏差; Simulink模型; MATLAB代码; 参考文档。,"基于扩展卡尔曼滤波的车辆多状态估计系统及其偏差分析:Simulink模型与MATLAB代码实现"
"基于V-REP与MATLAB联合仿真的小车项目:循迹、避障、走迷宫及路径规划的详细代码与文档说明匹配版",V-REP小车项目+匹配文档,基于V-REP与MATLAB联合仿真,小车能够完成循迹、避障、走迷宫和路径规划,提供详细代码和文档说明。 ,核心关键词:V-REP小车项目; 匹配文档; 联合仿真; 循迹; 避障; 走迷宫; 路径规划; 详细代码; 文档说明。,V-REP小车项目:循迹避障与路径规划联合仿真实现
2022年7月环境管理体系基础