java组合模式
前言
组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。
工作中常用的就是树形结构,菜单结构
1,故事
一个后台管理系统中,必然存在很个菜单,每个一级菜单下有各自的二级菜单,二级菜单下甚至还有三级菜单。这样的层级结构,可以用组合模式实现。
2,使用
创建 菜单类(menu)
@Data
public class Menu {
//菜单名称
private String name;
//下级子菜单
private List<Menu> menus = new ArrayList<>();
public Menu(String name) {
this.name = name;
}
//新增子菜单
public void add(Menu menu){
this.menus.add(menu);
}
//移除子菜单
public void remove(Menu menu){
this.menus.remove(menu);
}
}
测试
//打印出整个菜单以及子菜单
public static void main(String[] args) {
Menu allMenu = new Menu("菜单");
Menu firstMenu = new Menu("1菜单");
//给菜单1 添加子菜单
firstMenu.add(new Menu("1.1菜单"));
firstMenu.add(new Menu("1.2菜单"));
firstMenu.add(new Menu("1.3菜单"));
Menu secondMenu = new Menu("2菜单");
//给菜单2 添加子菜单
secondMenu.add(new Menu("2.1菜单"));
secondMenu.add(new Menu("2.2菜单"));
Menu menu = new Menu("2.3菜单");
//给菜单2.3 添加3级子菜单
menu.add(new Menu("2.3.1菜单"));
menu.add(new Menu("2.3.2菜单"));
menu.add(new Menu("2.3.3菜单"));
secondMenu.add(menu);
//加入到主菜单中
allMenu.add(firstMenu);
allMenu.add(secondMenu);
//打印
print(allMenu);
}
//打印菜单
private static void print(Menu menu){
System.out.println(menu.getName());
List<Menu> menus = menu.getMenus();
if(!CollectionUtils.isEmpty(menus)){
for (Menu mu : menus) {
print(mu);
}
}
}
输出结果
菜单
1菜单
1.1菜单
1.2菜单
1.3菜单
2菜单
2.1菜单
2.2菜单
2.3菜单
2.3.1菜单
2.3.2菜单
2.3.3菜单
总结
组合模式是最常用的模式之一
优点:
1、高层模块调用简单。
2、节点自由增加。
缺点:
在使用组合模式时,其叶子和树枝的声明都是实现类,而不是接口,违反了依赖倒置原则。
使用场景:
部分、整体场景,如树形菜单,文件、文件夹的管理。