0

我正在阅读“ Head First Design Pattern ”,现在我陷入了Composition 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 ......为什么会这样?我的代码有什么问题......我只是在递归算法上弄错了吗?谢谢

4

0 回答 0