组合模式

组合模式属于属于结构型模式,又叫部分整体模式

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

用来描述部分与整体的关系,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,所以组合模式的使用场景就是出现树形结构的地方。比如:树形菜单,文件目录等树形结构数据的操作

优点

  1. 高层模块调用简单
  2. 节点自由增加

缺点

在使用组合模式时,其叶子和树枝的声明都是实现类,而不是接口,违反了依赖倒置原则

模式代码实现

源码地址:https://github.com/mingyuHub/design-patterns

菜单类

每个一级菜单有子菜单,二级子菜单有三级菜单,以此形成一个树形结构

/**
 * @author: chenmingyu
 * @date: 2019/3/12 17:46
 * @description:
 */
@Data
public class Menu {

    /**
     * 菜单名
     */
    private String name;

    /**
     * 路径
     */
    private String path;

    private List<Menu> menus;

    public Menu(String name, String path) {
        this.name = name;
        this.path = path;
        menus = new ArrayList<>();
    }

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

    public void remove(Menu menu){
        menus.remove(menu);
    }
}
验证
public static void main(String[] args) {
    Menu home = new Menu("首页","/");
    Menu tag = new Menu("标签","/标签");
    Menu archive = new Menu("归档","/归档");
    Menu menu1 = new Menu("子菜单1","/子菜单1");
    Menu menu2 = new Menu("子菜单2","/子菜单2");
    home.add(tag);
    home.add(archive);
    tag.add(menu1);
    archive.add(menu2);
    home.getMenus().forEach(menu ->{
        System.out.println(menu);
    });
}

输出

Menu(name=标签, path=/标签, menus=[Menu(name=子菜单1, path=/子菜单1, menus=[])])
Menu(name=归档, path=/归档, menus=[Menu(name=子菜单2, path=/子菜单2, menus=[])])

参考:设计模式之禅:https://www.kancloud.cn/sstd521/design/193581

推荐阅读:23种设计模式详解