上一章迭代器模式,定义了一个菜单类,可以添加若干个菜单项,现在如果每个菜单项又可以是一个菜单,该如何表示呢
按照组合模式的定义,我们应该将菜单设为组合对象,菜单项设为叶子对象,而且它们有一个共同的接口抽象组件
首先定义抽象组件
package composite.demo1;
public abstract class MenuComponent
{
public void add(MenuComponent menuComponent)
{
throw new UnsupportedOperationException();
}
public void remove(MenuComponent menuComponent)
{
throw new UnsupportedOperationException();
}
public MenuComponent getChild(int i)
{
throw new UnsupportedOperationException();
}
public void print()
{
throw new UnsupportedOperationException();
}
}
接着定义菜单和菜单项,它们都是抽象组件的子类
package composite.demo1;
import java.util.ArrayList;
import java.util.Iterator;
public class Menu extends MenuComponent
{
ArrayList<MenuComponent> menuComponents = new ArrayList<MenuComponent>();
String name;
String description;
public Menu(String name, String description) {
this.name = name;
this.description = description;
}
public void add(MenuComponent menuComponent) {
menuComponents.add(menuComponent);
}
public void remove(MenuComponent menuComponent) {
menuComponents.remove(menuComponent);
}
public MenuComponent getChild(int i) {
return menuComponents.get(i);
}
public void print()
{
System.out.print("\n" + this.name+": " + this.description);
System.out.println("---------------------");
Iterator<MenuComponent> iterator = menuComponents.iterator();
while (iterator.hasNext())
{
MenuComponent menuComponent = iterator.next();
menuComponent.print();
}
}
}
package composite.demo1;
/**
* 菜单项
*/
public class MenuItem extends MenuComponent
{
private String name; //菜单项名称
private String description; //描述
private double price; //价格
public MenuItem(String name,
String description,
double price)
{
this.name = name;
this.description = description;
this.price = price;
}
public void print()
{
System.out.println(this.name+": " + this.description + ", $" + price);
}
}
女服务员,报菜单
package composite.demo1;
/**
* 服务员类,根据餐厅打印菜单
*/
public class Waitress
{
MenuComponent allMenus;
public Waitress(MenuComponent allMenus) {
this.allMenus = allMenus;
}
public void printMenu() {
allMenus.print();
}
}
测试类
package composite.demo1;
public class Client
{
public static void main(String[] args)
{
//创建根组件
MenuComponent allMenus = new Menu("ALL MENUS", "All menus combined");
//创建三个菜单
MenuComponent pancakeHouseMenu = new Menu("煎饼屋菜单", "早餐");
MenuComponent dinerMenu = new Menu("对象村菜单", "午餐");
MenuComponent dessertMenu = new Menu("甜点菜单", "点心");
//添加到根组件
allMenus.add(pancakeHouseMenu);
allMenus.add(dinerMenu);
//菜单添加菜单项
pancakeHouseMenu.add(new MenuItem("薄煎饼早餐","薄煎饼、鸡蛋和土司",2.99));
pancakeHouseMenu.add(new MenuItem("蓝莓薄煎饼","新鲜蓝莓和蓝莓果酱做成的薄煎饼",2.99));
pancakeHouseMenu.add(new MenuItem("松饼","松饼,可以选择蓝莓或者草莓口味",3.59));
dinerMenu.add(new MenuItem("素食 BLT", "(煎)培根, 生菜和西红柿", 2.99));
dinerMenu.add(new MenuItem("清汤", "一碗清汤, 配土豆沙拉", 3.29));
dinerMenu.add(new MenuItem("热狗", "一个热狗, 酸菜, 芝士, 洋葱", 3.05));
dinerMenu.add(dessertMenu);
dessertMenu.add(new MenuItem("芝士蛋糕", "一个芝士蛋糕,一杯咖啡", 10.05));
Waitress waitress = new Waitress(allMenus);
waitress.printMenu();
}
}
测试结果,完成了树形结构遍历