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