组合模式
定义
组合模式又叫部分整体模式,它是一种对象组合成树状层次结构的模式,使用户对单个对象和组合对象具有一致的访问性,即访问单个对象和组合对象对于用户来说没有区别。
角色
- 抽象构件角色:它的主要作用是为树叶构件和树枝构件声明公共的接口,并实现他们的默认行为(一些方法),它是抽象类。在透明式组合模式中,抽象构件还声明访问和管理子类对象的接口;在安全的组合模式中抽象构件不声明访问和管理子类对象的接口,其管理工作交给树枝构建完成
- 树叶构件角色:组合模式中的叶子节点对象,它没有子节点,用于实现抽象构件角色中声明的公共接口
- 树枝构件角色:是组合模式中的分支节点对象,它有子节点,实现了抽象构建角色中声明的公共接口,主要存储和管理子部件,通常包含Add()、Remove()、GetChild()方法。
案例实现
打印菜单以及它的所有子菜单和子菜单项的名字
1.抽象构件
public abstract class MenuComponent {
protected String name;
protected int level;
public void add(MenuComponent menuComponent) {
//
}
public void remove(MenuComponent menuComponent) {
}
public String getName() {
return name;
}
//抽象方法,公共方法,被叶子和树枝构件实现
public abstract void print();
}
2.树枝构件
public class Menu extends MenuComponent{
//用于存储和管理子部件
private List<MenuComponent> menus = new ArrayList<>();
public Menu(String name,int level) {
this.name = name;
this.level = level;
}
@Override
public void add(MenuComponent menuComponent) {
menus.add(menuComponent);
}
@Override
public void remove(MenuComponent menuComponent) {
menus.remove(menuComponent);
}
@Override
public void print() {
for (int i = 0; i < level; i++) {
System.out.print("--");
}
System.out.println(getName());
for (MenuComponent m:menus){
m.print();
}
}
}
3.树叶构件
public class MenuItem extends MenuComponent{
public MenuItem(String name, int level) {
this.name = name;
this.level = level;
}
@Override
public void print() {
for (int i = 0; i < level; i++) {
System.out.print("--");
}
System.out.println(name);
}
}
4.测试类
public class ClientTest {
public static void main(String[] args) {
MenuItem i1 = new MenuItem("页面访问",3);
MenuItem i2 = new MenuItem("展开菜单",3);
MenuItem i3 = new MenuItem("编辑菜单",3);
MenuItem i4 = new MenuItem("删除菜单",3);
MenuComponent menu = new Menu("菜单管理",2);
menu.add(i1);
menu.add(i2);
menu.add(i3);
menu.add(i4);
// menu.print();
//
MenuItem k1 = new MenuItem("页面访问",3);
MenuItem k2 = new MenuItem("提交保存",3);
Menu menu1= new Menu("权限配置", 2);
menu1.add(k1);
menu1.add(k2);
//
MenuItem j1 = new MenuItem("页面访问",3);
MenuItem j2 = new MenuItem("新增角色",3);
MenuItem j3 = new MenuItem("修改角色", 3);
Menu menu2 = new Menu("角色管理", 2);
//总的
Menu menu3 = new Menu("系统管理", 1);
menu3.add(menu);
menu3.add(menu1);
menu3.add(menu2);
menu3.print();
}
}
输出结果: