合工大很牛很牛牛

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  14 Posts :: 1 Stories :: 37 Comments :: 0 Trackbacks
 

Iterator Pattern中,我们实现了各式各样的menu,有的menu中的元素的是数组,有的是ArrayList,有的是HashTable等等。我们用一个通用的Iterator 接口实现对各种类型menu的迭代调用。

但是有个问题,所有的这些menu可不可以有它的子菜单呢?比如说我的菜单里面有一种菜叫做“午餐套餐”,午餐套餐里面分为几种,有法式的午餐套餐,有中式的套餐,还有俄式的,而“法式套餐”里面有5个菜,中式的有6个不同的菜。。。。。。

也就是说,能不能菜单“套”菜单呢?

Iterator Pattern只能提供一个平行的菜单组合,而我们要一个树形的。

树形的结点分为两种类型:一种是叶节点,一种是非叶节点(包含子结点)。

我们给叶节点和非叶节点创造一个统一的接口MenuComponent方便调用(在调用的时候就并不需要知道该结点是非叶节点还是叶结点,这样就可以对所有的结点进行统一的操作),叶节点实现该接口的一部分功能(getName, getPrice, getDescription,print),而非叶节点实现另一部分功能(add, remove, getChildren,print),其中非叶节点的print是通过迭代其子结点的print功能实现的。属于同一个父节点的各个子节点,我们用ArrayList来收集。

 

package javaapplication40;

 

import java.util.ArrayList;

import java.util.Iterator;

 

public class Main {

    public static void main(String[] args) {

        MenuComponent mc1 = new Menu("menu0", "description0");

        mc1.add(new MenuItem("menuItem1", "MenuDescription1", 2.9));

        mc1.add(new MenuItem("menuItem2", "MenuDescription2", 3.9));

        MenuComponent mc2 = new Menu("menu3", "description3");

        mc1.add(mc2);

        mc2.add(new MenuItem("menuItem4", "MenuDescription4", 4.9));

        mc2.add(new MenuItem("menuItem5", "MenuDescription5", 5.9));

        mc1.print();

    }

}

 

interface MenuComponent {

    public String getDescription();

    public String getName();

    public double getPrice();

    public void print();

    public void add(MenuComponent mc);

    public void remove(MenuComponent mc);

    public ArrayList<MenuComponent> getChildren();

}

 

class MenuItem implements MenuComponent { //leaf node

    String name;

    String description;

    double price;

    public MenuItem(String name, String description, double price) {

        this.name = name;

        this.description = description;

        this.price = price;

    }

    public String getDescription() {

        return description;

    }

    public String getName() {

        return name;

    }

    public double getPrice() {

        return price;

    }

    public void print() {

        System.out.println(getName() + ":" + getDescription() + " " + getPrice());

    }

    public void add(MenuComponent mc) {  // 叶节点没有以下三个功能

        throw new UnsupportedOperationException("Not supported yet.");

    }

    public void remove(MenuComponent mc) {

        throw new UnsupportedOperationException("Not supported yet.");

    }

    public ArrayList<MenuComponent> getChildren() {

        throw new UnsupportedOperationException("Not supported yet.");

    }

}

 

class Menu implements MenuComponent { //非叶节点,包含子结点的结点

    String name;

    String description;

    ArrayList<MenuComponent> children = new ArrayList<MenuComponent>();

    public Menu(String name, String description) {

        this.name = name;

        this.description = description;

    }

    public void add(MenuComponent mc) {

        children.add(mc);

    }

    public void remove(MenuComponent mc) {

        children.remove(mc);

    }

    public ArrayList<MenuComponent> getChildren() {

        return children;

    }

    public String getDescription() { //非叶节点没有以下三个功能

        throw new UnsupportedOperationException("Not supported yet.");

    }

    public String getName() {

        throw new UnsupportedOperationException("Not supported yet.");

    }

    public double getPrice() {

        throw new UnsupportedOperationException("Not supported yet.");

    }

    public void print() { //两种方法都可以,相当于广度搜索

//        ArrayList<MenuComponent> children = new ArrayList<MenuComponent>();

//        children = getChildren();

//        for (MenuComponent mc : children) {

//            mc.print();

//        }

        Iterator<MenuComponent> iterator = getChildren().iterator();//Iterator Pattern只能在一个平面上使用

        while (iterator.hasNext()) {

            iterator.next().print();

        }

    }

}

posted on 2008-07-18 00:46 化的了 阅读(1195) 评论(0)  编辑  收藏 所属分类: 设计模式

只有注册用户登录后才能发表评论。


网站导航: