组合模式
组合模式属于属于结构型模式,又叫部分整体模式
定义:将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。
用来描述部分与整体的关系,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,所以组合模式的使用场景就是出现树形结构的地方。比如:树形菜单,文件目录等树形结构数据的操作
优点
- 高层模块调用简单
- 节点自由增加
缺点
在使用组合模式时,其叶子和树枝的声明都是实现类,而不是接口,违反了依赖倒置原则
模式代码实现
源码地址: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种设计模式详解