java多级对象的封装

hf201429 发布于 2016/04/29 12:14
阅读 363
收藏 0

现在有这样一个场景:

一级菜单,二级菜单,三级菜单。一级下面可以有多个二级,二级下面可以有多个三级。一级也有多个。这些对象使用一个表menu(id,name,parentId)来表示的彼此的层级关系用parentId来表示的。

现在想对外提供一个借口,根据菜单id查询这个菜单的信息,如果有子菜单子菜单也要查询出来。这样一个对象怎样实现?因为你不知道传过来的id是一级还是二级还是三级。所以想请教下这怎样去实现返回这个对象。

加载中
0
梅开源
梅开源

这玩意俗名叫三级分类或无限级分类,是一个古老的各种语言都能实现的话题,其实和java和面向对象没什么关系,拿asp不面向对象都能写,所以千万别想多级对象和返回对象,那些是基于java实现时的糟粕。


0
梅开源
梅开源

你应该这样思考:三级菜单实际是一个树形结构,菜单表现方式。 交互上, 用户通过查询xx.jsp?nodeid=x, 即可获取到id为x的节点和其下各节点的数据,前端再可实现成各种漂亮效果。

所以可以分三个层面实现:

1. 数据库

设计表结构成 id, name, parentId, 如果要程序更省力,可以加上表示是否还有子节点,子节点数,以及表示是第几层的level, 以及最顶端节点祖宗节点。

2. 后端程序

构建一个按照id=?的get查询,

写一个函数,递归查询,查询parentid为x的所有节点,再对每个节点应用一次这个函数,如此递归将所有查询出的节点拼起来,返回出一个json格式的数据。这种是最暴力的。

如果要程序省力点,如上所述在数据库加了字段以后, 程序里查询出parent为x的节点后,根据其是否有子节点决定是否要继续查询, 也可根据需要查到第几层决定是否停下来。

3. 前端程序

随便找个好看的菜单,再把那个json里数据解析出来塞进去。


以及加上点实现了以后的考虑:

4. 优化

一般来说,菜单不会太大,所以可以查询一次后就缓存起来。


0
maradona
maradona

先把菜单集合构建成一个树,然后

import java.util.List;

public class Menu {

	long id;
	String name;
	long parentId;
	List<Menu> childs;
	
	public Menu find(long parmId){
		if(id == parmId){
			return this;
		}
		if(childs == null || childs.isEmpty()){
			return null;
		}
		for(Menu child : childs){
			Menu menu = child.find(parmId);
			if(menu != null){
				return menu;
			}
		}
		return null;
	}
}



0
hf201429
hf201429

引用来自“梅开源”的评论

你应该这样思考:三级菜单实际是一个树形结构,菜单表现方式。 交互上, 用户通过查询xx.jsp?nodeid=x, 即可获取到id为x的节点和其下各节点的数据,前端再可实现成各种漂亮效果。

所以可以分三个层面实现:

1. 数据库

设计表结构成 id, name, parentId, 如果要程序更省力,可以加上表示是否还有子节点,子节点数,以及表示是第几层的level, 以及最顶端节点祖宗节点。

2. 后端程序

构建一个按照id=?的get查询,

写一个函数,递归查询,查询parentid为x的所有节点,再对每个节点应用一次这个函数,如此递归将所有查询出的节点拼起来,返回出一个json格式的数据。这种是最暴力的。

如果要程序省力点,如上所述在数据库加了字段以后, 程序里查询出parent为x的节点后,根据其是否有子节点决定是否要继续查询, 也可根据需要查到第几层决定是否停下来。

3. 前端程序

随便找个好看的菜单,再把那个json里数据解析出来塞进去。


以及加上点实现了以后的考虑:

4. 优化

一般来说,菜单不会太大,所以可以查询一次后就缓存起来。


递归去实现,是不是时间太长了,如果我经常需要去查询这个菜单,而且菜单确实比较多。那又怎么办?
白眼狼
放缓存是一种方案,如果你觉得查询菜单的sql慢,可以在sql上做文章
Shazi199
Shazi199
人家写了个第四点优化,你还问怎么办。。
返回顶部
顶部