`
y806839048
  • 浏览: 1127018 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

迭代模式:(用于树形结构的构建)

 
阅读更多

 

迭代模式:(用于树形结构的构建)

迭代是“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&amp;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

分享到:
评论

相关推荐

    树形结构(1).zip

    在Unity3D游戏开发中,树形结构是一种常见的数据组织方式,它被广泛应用于场景管理、组件系统...这个压缩包中的示例项目可能是为了演示如何在Unity中构建和控制这样的树形结构,以便读者能够更好地理解和应用这些概念。

    组合模式二叉树,前序、中序、后续,迭代器模式访问遍历

    通过组合模式,我们能够轻松地管理树形结构,而迭代器模式则提供了灵活且统一的遍历机制。这些概念不仅适用于Java,也是面向对象编程中的通用最佳实践。理解和掌握这些知识点,对于提升软件开发能力具有极大的帮助。

    界面:树形导航的使用

    "界面:树形导航的使用"这一主题旨在探讨如何在项目中有效地利用这种导航模式,以提高用户体验并简化复杂的菜单系统。 树形导航的核心特征在于其层次性,它通过节点和子节点的关系来展示信息,通常以展开和折叠的...

    用js实现树形结构

    在“treemaker”文件中,可能会包含一些示例代码或者库,用于更高效地创建和操作树形结构,例如递归函数、迭代器模式、以及可视化树形结构的工具等。这些工具可以帮助简化树的构建过程,提供便利的API来执行常见的树...

    设计模式相关资料设计模式相关资料

    - 组合模式:允许你将对象组合成树形结构来表现“整体-部分”关系。 - 装饰模式:动态地给一个对象添加一些新的行为,而不会改变其本质。 - 外观模式:为子系统提供一个统一的接口,简化客户端与其交互。 - 代理...

    C#面向对象设计模式纵横谈(25):设计模式总结

    8. 组合模式:组合模式将对象组合成树形结构,可以表示部分与整体的关系,使得用户对单个对象和组合对象的使用具有一致性。 9. 装饰模式:装饰模式动态地给对象添加一些额外的职责,提供比继承更具有弹性的扩展方式...

    设计模式:可服用面向对象软件的基础

    3. 组合模式:允许你将对象组合成树形结构,表现得像单个对象。 4. 装饰模式:动态地给一个对象添加一些额外的职责,增加功能而不改变其原有结构。 5. 外观模式:为复杂的子系统提供一个简单的接口。 6. 享元模式:...

    《设计模式:可复用面向对象软件的基础》学习并理解 23 种设计模式

    - **组合模式**(Composite):将对象组合成树形结构以表示部分-整体层次结构。 - **装饰器模式**(Decorator):动态地给一个对象添加一些额外的责任。 - **外观模式**(Facade):为子系统中的一组接口提供一个...

    使用C语言实现23种设计模式。.zip

    - 组合模式:允许你将对象组合成树形结构来表现“整体-部分”层次结构。 2. 结构型设计模式: - 代理模式:为其他对象提供一种代理以控制对这个对象的访问。 - 桥接模式:将抽象部分与实现部分分离,使它们可以...

    设计模式教材pdf 中文版

    - 组合模式:允许你将对象组合成树形结构来表示“部分-整体”的层次结构。 - 装饰模式:动态地给对象添加一些额外的职责,为对象添加新的行为或属性而不改变其结构。 - 外观模式:提供一个统一的接口,用来访问子...

    23种设计模式代码-c#

    - 组合模式:允许你将对象组合成树形结构,表现得像单个对象。 - 装饰模式:动态地给对象添加新的职责,比继承更灵活。 - 外观模式:提供一个统一的接口,用来访问子系统的一组接口。 - 代理模式:为其他对象...

    设计模式Java版 设计模式Java版 设计模式Java版

    - 组合模式:允许你将对象组合成树形结构,以表现“部分-整体”的层次结构。 2. 结构型模式: - 适配器模式:将一个类的接口转换为客户期望的另一个接口。 - 桥接模式:将抽象部分与实现部分分离,使它们可以...

    【您的设计模式】趣味介绍23种设计模式

    - 组合模式:允许你将对象组合成树形结构,表现得像单个对象。 - 装饰模式:动态地给一个对象添加一些额外的职责。 - 外观模式:为子系统提供一个统一的接口,使得客户端可以更简单地与其交互。 - 代理模式:为...

    23种 设计模式

    - 组合模式:允许你将对象组合成树形结构,表现得像单个对象。 - 装饰模式:动态地给对象添加新的职责,避免使用子类来扩展功能。 - 外观模式:提供一个统一的接口,用来访问子系统的一组接口。 - 享元模式:...

    设计模式介绍与迭代

    9. **组合模式**:允许你将对象组合成树形结构来表现“整体/部分”层次结构。 10. **享元模式**:在不影响功能的前提下,减少对象的数量,以达到提高系统性能的目的。 二、迭代及其在软件开发中的应用 迭代是软件...

    设计模式_设计模式_

    - 组合模式(Composite):将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。 - 装饰模式(Decorator):动态地给一个对象添加一些额外的职责,提供了一种使用...

    设计模式(软件设计模式)

    - 组合模式:允许你将对象组合成树形结构来表示“部分-整体”的层次结构。 - 装饰模式:动态地给对象添加一些额外的职责,避免使用子类进行扩展。 - 外观模式:提供一个统一的接口,用来访问子系统中的多个接口。...

    设计模式合集案例

    - 组合模式:允许你将对象组合成树形结构来表现“部分-整体”的层次结构。 - 桥接模式:将抽象部分与实现部分分离,使它们可以独立地变化。 - 外观模式:为子系统提供一个统一的接口,使得子系统的复杂性对客户...

Global site tag (gtag.js) - Google Analytics