

public class CompositeTest {
    public static void main(String[] args){
        // 创建主菜单
        MenuComponent mainMenu = new Menu("Insert");
        // 创建子菜单
        MenuComponent subMenu = new Menu("Chart");
        // 创建菜单项
        MenuComponent element = new MenuItem("On This Sheet");
        
        // 将子菜单添加到主菜单中
        mainMenu.addMenuElement(subMenu);
        // 将菜单项添加到子菜单中
        subMenu.addMenuElement(element);
        
        // 打印菜单结构
        printMenus(mainMenu);
    }
    
    private static void printMenus(MenuComponent ifile){
        // 打印当前菜单的名称
        ifile.printName();
        // 获取当前菜单的子元素列表
        List<MenuComponent> children = ifile.getElement();
        // 如果子元素列表为空,则直接返回
        if(children == null) return;
        
        // 遍历子元素列表,递归打印每个子元素的名称
        for(MenuComponent element : children){
            printMenus(element);
        }
    }
} 
 public class Menu extends MenuComponent{
    private List<MenuComponent> elementList;
    public Menu(String name){
        this.name = name;
        this.elementList = new ArrayList<>();
    }
    public boolean addMenuElement(MenuComponent element){
        return elementList.add(element);
    }
    public boolean removeMenuElement(MenuComponent element){
        return elementList.remove(element);
    }
    public List<MenuComponent> getElement(){
        return elementList;
    }
} 
 public class MenuItem extends MenuComponent{
    public MenuItem(String name){
        this.name = name;
    }
    public boolean addMenuElement(MenuComponent element){
        return false;
    }
    public boolean removeMenuElement(MenuComponent element){
        return false;
    }
    public List<MenuComponent> getElement(){
        return null;
    }
} 
 public abstract class MenuComponent {
    protected String name;
    public void printName(){
        System.out.println(name);
    }
    public abstract boolean addMenuElement(MenuComponent element);
    public abstract List<MenuComponent> getElement();
} 
  
 MenuComponent 抽象类:定义了菜单组件的基本行为,包括打印名称和管理子元素的方法。
Menu 类:表示菜单,可以包含其他菜单或菜单项。
MenuItem 类:表示菜单中的一个具体项。
CompositeTest 类:包含了 main 方法,用于测试组合模式的实现。
在 CompositeTest 类中,main 方法创建了一个主菜单、一个子菜单以及一个菜单项,并将它们按照一定的结构添加到了一起。然后调用 printMenus 方法打印整个菜单的结构。
Menu 类表示菜单,它继承自 MenuComponent 抽象类,并实现了该抽象类中的抽象方法。Menu 类中包含一个 elementList 成员变量,用于存储菜单中的子元素(即菜单或菜单项)。它提供了添加和移除子元素的方法,并实现了抽象方法 getElement 来获取子元素列表。
MenuComponent 抽象类定义了菜单组件的基本行为,包括打印名称和管理子元素的方法。它有一个 name 成员变量表示菜单组件的名称,并定义了一个抽象方法 addMenuElement 用于添加子元素,以及一个抽象方法 getElement 用于获取子元素列表。
MenuItem 类表示菜单中的一个具体项,它继承自 MenuComponent 抽象类,并实现了该抽象类中的抽象方法。由于菜单项不包含其他子元素,因此 addMenuElement、removeMenuElement 和 getElement 方法的实现都返回了相应的默认值。







![Microsoft Visio 参与者 [actor] - 人的形状图标](https://img-blog.csdnimg.cn/direct/b023b7b6a59042389cfd6e827f0d0ba4.png#pic_center)





![[ritsec CTF 2024] 密码部分](https://img-blog.csdnimg.cn/direct/62db8a9c8e3c4216ac6f0070a1d60789.jpeg)




