快速上手设计模式9 - 组合模式

组合模式概念:将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。

例子:网页通常有导航菜单,菜单分为一级菜单、二级菜单、三级菜单甚至更多,此时就适合用组合模式,表示菜单的树形结构。

创建菜单类,同时提供引用自身对象的list

public class Menu {
    /* 菜单等级 */
    String level;
    /* 菜单名称 */
    String name;
    /* 子菜单 */
    List<Menu> menuList = new ArrayList<>();

    public Menu(String level, String name) {
        this.level = level;
        this.name = name;
    }

    public void add(Menu menu) {
        menuList.add(menu);
    }

    public void remove(Menu menu) {
        menuList.remove(menu);
    }

    /** 打印 */
    public void toString(String str) {
        System.out.println(str + "level:" + this.level + ", name:" + this.name);
        str = str + "   ";
        for (Menu menu : menuList) {
            menu.toString(str);
        }
    }
}

客户端

Menu rootMenu=new Menu("一级菜单", "首页");

Menu SecMenu1=new Menu("二级菜单","菜单1");

Menu SecMenu2=new Menu("二级菜单","菜单2");

Menu ThrMenu1=new Menu("三级菜单","菜单1");

Menu ThrMenu2=new Menu("三级菜单","菜单2");
//一级菜单放入二级菜单
rootMenu.add(SecMenu1);
rootMenu.add(SecMenu2);
//二级菜单1放入三级菜单
SecMenu1.add(ThrMenu1);
SecMenu1.add(ThrMenu2);

rootMenu.toString("");

输出结果

level:一级菜单, name:首页
   level:二级菜单, name:菜单1
      level:三级菜单, name:菜单1
      level:三级菜单, name:菜单2
   level:二级菜单, name:菜单2

一个树形的菜单结构就有了。
组合模式的核心是定义包含自身对象的集合,从而形成树的结构,让每个节点都有同样的元素和操作,使得用户对单个对象和组合对象的使用具有一致性。

总结:
1. 组合模式最终形成树形结构以表示”部分-整体”的层次结构,因此适用于所有需要有层次结构的场景,包括文件结构,树形菜单等。

猜你喜欢

转载自blog.csdn.net/u012882327/article/details/80911199