如何使用迭代器模式遍历在Composition Pattern中设计的对象结构

时间:2013-03-05 09:08:25

标签: java algorithm design-patterns

我正在阅读“ Head First Design Pattern ”,现在我陷入了构图模式中的一些代码,第369页。结构以合成模式设计并遍历迭代器模式。

CompositeIterator的核心算法代码是:

public boolean hasNext() {
    // TODO Auto-generated method stub
    if (itemStack.size() == 0) {
        return false;
    } else {
        Iterator<MenuComponent> iter = itemStack.peek();
        if (!iter.hasNext()) {
            itemStack.pop();
            return hasNext();
        } else {
            return true;
        }
    }
}
public MenuComponent next() {
    // TODO Auto-generated method stub
    if (hasNext()) {
        Iterator<MenuComponent> iter = this.itemStack.peek();
        MenuComponent mc = iter.next();
        if (mc instanceof Menu) {
            itemStack.push(mc.createIterator());
        }
        return mc;
    } else {
        return null;
    }
}

这是打印功能:

public void printAll(){
    Iterator<MenuComponent> iter=menus.createIterator();
    while(iter.hasNext()){
        MenuComponent mc=iter.next();
        System.out.println(mc.getName()+" "+mc.getDescription());
    }
}

以下是代码的主要功能:

    Menu m1 = new Menu("aaa", "a");
    Menu m2 = new Menu("bbb", "b");
    Menu m3 = new Menu("ccc", "c");

    Menu all=new Menu("all", "all");
    all.add(m1);
    m1.add(m2);
    m2.add(m3);
    Waitress w=new Waitress(all);
    w.printAll();

当我尝试打印所有这些时,结果将是这样的:

a aaa

b bbb

c ccc

c ccc

似乎迭代器只是忽略了allmenu项目并打印了m3两次......为什么会发生?我的代码有什么问题......我刚才错误的递归算法? 感谢

0 个答案:

没有答案