迭代模式:(用于树形结构的构建)
迭代是“V”字形的逐级进入,进到最底层,和剩余代码执行完,逐级出来的特性(类似调试断点的进入,和执行完才跳出,在进入处
继续向下),使用迭代的时候应该在开始迭代具体业务的时候,设置不再调用迭代的条件,只要达到一次不调用条件,就会原路返回
A(){
....
busnis0();
B();
}
B(){
if(..!=null){
busnis();
B();
busnis2();迭代时的业务处理可以放在再次调用的前/后
}
}
下面的例子构建树的时候,(可以直接用sql构建树)
A中和B中的业务一样,只不过A做一下根节点的情况,用这个引子,调用迭代(即迭代的引子,业务很大情况下和迭代中的业务方法一致,只作为一个引子)
//迭代中的变量累加
List a(){
List b;
b.add();//本此业务获得
return b.add(a());//子业务获得
}//这样每次就实现返回本+子从而实现叠加
=========================================================
//对树形结构数据构建1,可以直接用sql,2,用Java编码, 对于来源不同表的树形结构的遍历如果是用Java组织的话(文件夹来源一个表,页面来源于一个表)
1,数据库设立一个公有的root,然后逐级遍历,遍历的时候考虑逐级遍历的同时,也要考虑跨级(级数跨越式衔接),遇到这种情况先考虑可以先考虑跨级的特殊情况的数据组织,然后考虑正常的逐级额遍历
2,用sql处理来源不同表的话只要关联下(树形结构本身就要自连接),但是对于跨级的sql的关联关系就复杂,不建议采用
可以两种结合,sql查出逐级的,剩下的跨级的用java再去完善(跨级的也就是省略了同一种类型(来源同一张表)的级数(比如少了级文件夹))
在实体设计的时候就要考虑跨级数据的承接字段,比如这里的文件夹中表中有
public MenuFolderDTO getMenuFolderByRoot(int level, String roleCurId)
{
MenuFolderDTO dto = null;
MenuFolder localObject1 = this.menuItemDao.findMenuFolderById("100000");最大的根节点,注意查的是opm_menufolder这张表
if (localObject1 != null)永远不为空
{
dto = new MenuFolderDTO(localObject1);
Set menuItemSet = localObject1.getMenuItems()这里虽然文件夹表没有页面的字段,但是是通过关联查出的;根节点找不到页面,之后根节点100000下一级的节点(是文件夹(菜单中的最外层)140000),
这个最外层下还有一个节点(我们菜单在的第二层140300),从这个第二层才可以查到菜页面140301,到了页面才可以找到按钮14030101
if ((menuItemSet != null) && (menuItemSet.size() > 0))最大的根节点没有页面,即检查每个文件夹否有直接有页面,有的话 把页面直接遍历出,没有的话再检查有没有文件夹
{
List menuItemDTOList = new ArrayList();
for (Iterator menuItemIt = menuItemSet.iterator(); menuItemIt.hasNext();)
{
MenuItemDTO menuItemDTO = new MenuItemDTO((MenuItem)menuItemIt.next());
if (level < 0)
{
if (menuItemDTO.getLevel1() >= level)
{
menuItemDTO.setRoleDetailArray(getStringToArray(menuItemDTO.getRoleDetail()));
List menuItemLimitList = this.menuItemLimitDao.getMenuItemLimitByTJ(menuItemDTO.getId(), null);
if ((menuItemLimitList != null) && (menuItemLimitList.size() > 0))
{
List menuItemLimitDTOList = new ArrayList();
for (Iterator menuItemLimitIt = menuItemLimitList.iterator(); menuItemLimitIt.hasNext();)
{
MenuItemLimitDTO menuItemLimitDTO = new MenuItemLimitDTO((MenuItemLimit)menuItemLimitIt.next());
menuItemLimitDTOList.add(menuItemLimitDTO);
}
menuItemDTO.setMenuItemLimitDTOList(menuItemLimitDTOList);
}
menuItemDTOList.add(menuItemDTO);
}
}
else
{
List menuItemRoleLimitCurList1 = this.roleLimitDao.getRoleLimitByTJ(menuItemDTO.getId(), null, roleCurId, Integer.valueOf(-1));
if ((menuItemRoleLimitCurList1 != null) && (menuItemRoleLimitCurList1.size() > 0) &&
(menuItemDTO.getLevel1() >= level))
{
menuItemDTO.setRoleDetailArray(getStringToArray(menuItemDTO.getRoleDetail()));
List menuItemLimitList = this.menuItemLimitDao.getMenuItemLimitByTJ(menuItemDTO.getId(), null);
if ((menuItemLimitList != null) && (menuItemLimitList.size() > 0))
{
List menuItemLimitDTOList = new ArrayList();
for (Iterator menuItemLimitIt = menuItemLimitList.iterator(); menuItemLimitIt.hasNext();)
{
MenuItemLimitDTO menuItemLimitDTO = new MenuItemLimitDTO((MenuItemLimit)menuItemLimitIt.next());
List menuItemRoleLimitCurList2 = this.roleLimitDao.getRoleLimitByTJ(menuItemDTO.getId(), menuItemLimitDTO.getId(), roleCurId, null);
if ((menuItemRoleLimitCurList2 != null) && (menuItemRoleLimitCurList2.size() > 0)) {
menuItemLimitDTOList.add(menuItemLimitDTO);
}
}
menuItemDTO.setMenuItemLimitDTOList(menuItemLimitDTOList);
}
menuItemDTOList.add(menuItemDTO);
}
}
}
dto.setMenuItemDTOList(menuItemDTOList);跨级的页面
}目前这种结构永远为空,这个可以留着防止后面直接在根节点下建立页面(上面这里就是跨级的处理)
List<MenuFolderDTO> dtoList = getChildrenMenu(level, localObject1, roleCurId);
dto.setMenuFolderDTOList(dtoList);没有跨级的文件夹
}
return dto;
}
private List getChildrenMenu(int level, MenuFolder menuFolder, String roleCurId)当前用户的,localObject1=最大的根节点
{
List<MenuFolderDTO> dtoList = new ArrayList();
Set set = menuFolder.getChildFolders();文件夹中的子文件夹,这里用迭代,这里第一次获取的是每个菜单,最外层的文件夹
Iterator it;
if ((set != null) && (set.size() > 0)) {
for (it = set.iterator(); it.hasNext();)
{
MenuFolder son = (MenuFolder)it.next();
MenuFolderDTO dto = new MenuFolderDTO(son);
Set menuItemSet = son.getMenuItems();
if ((menuItemSet != null) && (menuItemSet.size() > 0))在是最外层的时候还是空,知道迭代到第二层,流着这种也是防止最外层下直接放页面(特殊处理跨级)
{
List menuItemDTOList = new ArrayList();
for (Iterator menuItemIt = menuItemSet.iterator(); menuItemIt.hasNext();)
{
MenuItemDTO menuItemDTO = new MenuItemDTO((MenuItem)menuItemIt.next());
if (level < 0)
{
if (menuItemDTO.getLevel1() >= level)
{
menuItemDTO.setRoleDetailArray(getStringToArray(menuItemDTO.getRoleDetail()));
List menuItemLimitList = this.menuItemLimitDao.getMenuItemLimitByTJ(menuItemDTO.getId(), null);
if ((menuItemLimitList != null) && (menuItemLimitList.size() > 0))
{
List menuItemLimitDTOList = new ArrayList();
for (Iterator menuItemLimitIt = menuItemLimitList.iterator(); menuItemLimitIt.hasNext();)
{
MenuItemLimitDTO menuItemLimitDTO = new MenuItemLimitDTO((MenuItemLimit)menuItemLimitIt.next());
menuItemLimitDTOList.add(menuItemLimitDTO);
}
menuItemDTO.setMenuItemLimitDTOList(menuItemLimitDTOList);
}
menuItemDTOList.add(menuItemDTO);
}
}
else
{
List menuItemRoleLimitCurList1 = this.roleLimitDao.getRoleLimitByTJ(menuItemDTO.getId(), null, roleCurId, Integer.valueOf(-1));
if ((menuItemRoleLimitCurList1 != null) && (menuItemRoleLimitCurList1.size() > 0) &&
(menuItemDTO.getLevel1() >= level))
{
menuItemDTO.setRoleDetailArray(getStringToArray(menuItemDTO.getRoleDetail()));
List menuItemLimitList = this.menuItemLimitDao.getMenuItemLimitByTJ(menuItemDTO.getId(), null);
if ((menuItemLimitList != null) && (menuItemLimitList.size() > 0))
{
List menuItemLimitDTOList = new ArrayList();
for (Iterator menuItemLimitIt = menuItemLimitList.iterator(); menuItemLimitIt.hasNext();)
{
MenuItemLimitDTO menuItemLimitDTO = new MenuItemLimitDTO((MenuItemLimit)menuItemLimitIt.next());
List menuItemRoleLimitCurList2 = this.roleLimitDao.getRoleLimitByTJ(menuItemLimitDTO.getMenuItemId(), menuItemLimitDTO.getId(), roleCurId, null);
if ((menuItemRoleLimitCurList2 != null) && (menuItemRoleLimitCurList2.size() > 0)) {
menuItemLimitDTOList.add(menuItemLimitDTO);
}
}
menuItemDTO.setMenuItemLimitDTOList(menuItemLimitDTOList);
}
menuItemDTOList.add(menuItemDTO);
}
}
}
dto.setMenuItemDTOList(menuItemDTOList);
}
List<MenuFolderDTO> sonList = getChildrenMenu(level, son, roleCurId);//迭代是“V”字形的逐级进入,进到最底层,和剩余代码执行完,逐级出来的特性(类似调试断点的进入,和执行完才跳出,在进入处
继续向下),使用迭代的时候应该在开始迭代具体业务的时候,设置不再调用迭代的条件,只要达到一次不调用条件,就会原路返回
dto.setMenuFolderDTOList(sonList);
if (((dto.getMenuItemDTOList() != null) && (dto.getMenuItemDTOList().size() > 0)) || ((sonList != null) && (sonList.size() > 0))) {
dtoList.add(dto);
}
}
}
return dtoList;
}
一些业务说明:
opm_menufolder <li treedataindex="141" outlinelevel="1" folderurl="/rtmp-portal/menuFolderAction.action?menuFolderId=110000" menufoldername="系统管理" class="l-last "><li treedataindex="142" outlinelevel="2" folderurl="/rtmp-portal/menuFolderAction.action?menuFolderId=110200" menufoldername="权限管理" class="l-first "><div class="l-body"><div class="l-box"></div><div class="l-box l-expandable-open"></div><div class="l-box l-tree-icon l-tree-icon-folder-open"></div><span>权限管理</span></div><ul class="l-children" style="display: block;"><li treedataindex="143" outlinelevel="3" menuitemname="市场维护" url="/rtmp-portal/organAction.action?parentId=100000&menuitemId=110201" class="l-first "><div class="l-body"><div class="l-box"></div><div class="l-box l-line"></div><div class="l-box l-note"></div><div class="l-box l-tree-icon l-tree-icon-leaf "></div><span>市场维护</span></div></li><li treedataindex="144" outlinelevel="3" menuitemname="角色维护" url="/rtmp-portal/roleAction.action?menuitemId=110202" class=""><div class="l-body"><div class="l-box"></div><div class="l-box l-line"></div><div class="l-box l-note"></div><div class="l-box l-tree-icon l-tree-icon-leaf "></div><span>角色维护</span></div></li><li treedataindex="145" outlinelevel="3" menuitemname="用户维护" url="/rtmp-portal/userAction.action?menuitemId=110203" class=""><div class="l-body"><div class="l-box"></div><div class="l-box l-line"></div><div class="l-box l-note"></div><div class="l-box l-tree-icon l-tree-icon-leaf "></div><span>用户维护</span></div></li><li treedataindex="146" outlinelevel="3" menuitemname="在线用户" url="/rtmp-portal/userAction!online.action?menuitemId=110204" class="l-last "><div class="l-body"><div class="l-box"></div><div class="l-box l-line"></div><div class="l-box l-note-last"></div><div class="l-box l-tree-icon l-tree-icon-leaf "></div><span>在线用户</span></div></li></ul></li>
opm_menuitem 这个是权限表(页面) <li treedataindex="146" outlinelevel="3" menuitemname="在线用户" url="/rtmp-portal/userAction!online.action?menuitemId=110204" class="l-last "><div class="l-body l-selected"><div class="l-box"></div><div class="l-box l-line"></div><div class="l-box l-note-last"></div><div class="l-box l-tree-icon l-tree-icon-leaf "></div><span>在线用户</span></div></li>
opm_menuitemlimit 操作按钮
select * from opm_menufolder t(文件夹(包括多个页面的文件夹))
dubbo服务的随机调用,不遵守原子性,比例进入了你的control方法不一定,等到跳转的时候会用该服务器的页面,可能会用到其他服务器的页面
文件夹和页面关联,,,关系维护在多方(页面)menuFolderID
在opm_menuitemlimit 中,通过menuItemId和页面一对一关联(相当于多对多的中间关联表)(把关联的字段放在下级)
根节点找不到页面,之后根节点100000下一级的节点(是文件夹(菜单中的最外层)140000),
这个最外层下还有一个节点(我们菜单在的第二层140300),从这个第二层才可以查到菜页面140301,到了页面才可以找到按钮14030101
相关推荐
在Unity3D游戏开发中,树形结构是一种常见的数据组织方式,它被广泛应用于场景管理、组件系统...这个压缩包中的示例项目可能是为了演示如何在Unity中构建和控制这样的树形结构,以便读者能够更好地理解和应用这些概念。
通过组合模式,我们能够轻松地管理树形结构,而迭代器模式则提供了灵活且统一的遍历机制。这些概念不仅适用于Java,也是面向对象编程中的通用最佳实践。理解和掌握这些知识点,对于提升软件开发能力具有极大的帮助。
"界面:树形导航的使用"这一主题旨在探讨如何在项目中有效地利用这种导航模式,以提高用户体验并简化复杂的菜单系统。 树形导航的核心特征在于其层次性,它通过节点和子节点的关系来展示信息,通常以展开和折叠的...
在“treemaker”文件中,可能会包含一些示例代码或者库,用于更高效地创建和操作树形结构,例如递归函数、迭代器模式、以及可视化树形结构的工具等。这些工具可以帮助简化树的构建过程,提供便利的API来执行常见的树...
- 组合模式:允许你将对象组合成树形结构来表现“整体-部分”关系。 - 装饰模式:动态地给一个对象添加一些新的行为,而不会改变其本质。 - 外观模式:为子系统提供一个统一的接口,简化客户端与其交互。 - 代理...
8. 组合模式:组合模式将对象组合成树形结构,可以表示部分与整体的关系,使得用户对单个对象和组合对象的使用具有一致性。 9. 装饰模式:装饰模式动态地给对象添加一些额外的职责,提供比继承更具有弹性的扩展方式...
3. 组合模式:允许你将对象组合成树形结构,表现得像单个对象。 4. 装饰模式:动态地给一个对象添加一些额外的职责,增加功能而不改变其原有结构。 5. 外观模式:为复杂的子系统提供一个简单的接口。 6. 享元模式:...
- **组合模式**(Composite):将对象组合成树形结构以表示部分-整体层次结构。 - **装饰器模式**(Decorator):动态地给一个对象添加一些额外的责任。 - **外观模式**(Facade):为子系统中的一组接口提供一个...
- 组合模式:允许你将对象组合成树形结构来表现“整体-部分”层次结构。 2. 结构型设计模式: - 代理模式:为其他对象提供一种代理以控制对这个对象的访问。 - 桥接模式:将抽象部分与实现部分分离,使它们可以...
- 组合模式:允许你将对象组合成树形结构来表示“部分-整体”的层次结构。 - 装饰模式:动态地给对象添加一些额外的职责,为对象添加新的行为或属性而不改变其结构。 - 外观模式:提供一个统一的接口,用来访问子...
- 组合模式:允许你将对象组合成树形结构,表现得像单个对象。 - 装饰模式:动态地给对象添加新的职责,比继承更灵活。 - 外观模式:提供一个统一的接口,用来访问子系统的一组接口。 - 代理模式:为其他对象...
- 组合模式:允许你将对象组合成树形结构,以表现“部分-整体”的层次结构。 2. 结构型模式: - 适配器模式:将一个类的接口转换为客户期望的另一个接口。 - 桥接模式:将抽象部分与实现部分分离,使它们可以...
- 组合模式:允许你将对象组合成树形结构,表现得像单个对象。 - 装饰模式:动态地给一个对象添加一些额外的职责。 - 外观模式:为子系统提供一个统一的接口,使得客户端可以更简单地与其交互。 - 代理模式:为...
- 组合模式:允许你将对象组合成树形结构,表现得像单个对象。 - 装饰模式:动态地给对象添加新的职责,避免使用子类来扩展功能。 - 外观模式:提供一个统一的接口,用来访问子系统的一组接口。 - 享元模式:...
9. **组合模式**:允许你将对象组合成树形结构来表现“整体/部分”层次结构。 10. **享元模式**:在不影响功能的前提下,减少对象的数量,以达到提高系统性能的目的。 二、迭代及其在软件开发中的应用 迭代是软件...
- 组合模式(Composite):将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。 - 装饰模式(Decorator):动态地给一个对象添加一些额外的职责,提供了一种使用...
- 组合模式:允许你将对象组合成树形结构来表示“部分-整体”的层次结构。 - 装饰模式:动态地给对象添加一些额外的职责,避免使用子类进行扩展。 - 外观模式:提供一个统一的接口,用来访问子系统中的多个接口。...
- 组合模式:允许你将对象组合成树形结构来表现“部分-整体”的层次结构。 - 桥接模式:将抽象部分与实现部分分离,使它们可以独立地变化。 - 外观模式:为子系统提供一个统一的接口,使得子系统的复杂性对客户...