组合模式——demo

上一章迭代器模式,定义了一个菜单类,可以添加若干个菜单项,现在如果每个菜单项又可以是一个菜单,该如何表示呢

 

按照组合模式的定义,我们应该将菜单设为组合对象,菜单项设为叶子对象,而且它们有一个共同的接口抽象组件

首先定义抽象组件

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();
    }
}

测试结果,完成了树形结构遍历

发布了138 篇原创文章 · 获赞 34 · 访问量 15万+

猜你喜欢

转载自blog.csdn.net/bbj12345678/article/details/105180911