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
方法的实现都返回了相应的默认值。