有没有读过head first设计模式的啊?其中的组合模式的一段算法代码有问题。

2013-03-03 20:37:49 +08:00
 RyanZhu
今天在看head first设计模式,发现在组合模式中,有段代码有问题,是在书的第369页,我利用书中的CompositeIterator来遍历MenuComponent时候,apple pie会打印两次,个人认为是在hasNext()实现的时候,漏pop了一个迭代器。我不知道是哪里错了,为何在有嵌套的对象中,嵌套对像会被打印两次呢?

@Override
public boolean hasNext() {
// TODO Auto-generated method stub
if (stack.empty()) {
return false;
} else {
Iterator<MenuComponent> iter = stack.peek();
if (!iter.hasNext()) {
this.stack.pop();
return hasNext();
} else {
return true;
}
}
}

@Override
public MenuComponent next() {
// TODO Auto-generated method stub
if (hasNext()) {
Iterator<MenuComponent> iter = stack.peek();
MenuComponent component = iter.next();
if(component instanceof MenuItem&&component.getName().equals("Apple pie")){
System.out.println("hello");
}
if (component instanceof Menu) {
stack.push(component.createIterator());
}
return component;
} else {
return null;
}
}


public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
Menu menu1=new Menu("Pancake house menu", "Breakfase");
Menu menu2=new Menu("Diner menu","Lunch");
Menu menu3=new Menu("Cafe menu", "Dinner");
Menu menu4=new Menu("Dessert menu", "dessert of course");
Menu allMenus=new Menu("All menus", "All menu combined");

allMenus.add(menu1);
allMenus.add(menu2);
allMenus.add(menu3);

menu2.add(new MenuItem("Pasta", "blarblarblarblar", true, 3.89));
menu2.add(menu4);
menu4.add(new MenuItem("Apple pie", "blarblarblarblar", true, 1.59));

Waitress w=new Waitress(allMenus);
w.printVegetarianMenu();
}

public class Waitress {
MenuComponent allMenus;

public Waitress(MenuComponent mc){
this.allMenus=mc;
}

public void printMenu(){
allMenus.print();
}

public void printVegetarianMenu() throws Exception{
Iterator<MenuComponent> iter=allMenus.createIterator();
int i=0;
while(iter.hasNext()){
if(i==2){
i++;
}
MenuComponent mc=iter.next();
try{
if(mc.isVegetarian()){
i++;
mc.print();
}
}catch(UnsupportedOperationException ex){}
}
}
}

menu 4里面的apple pie会被打印两次,这是为什么呢?
3563 次点击
所在节点    程序员
2 条回复
cikelengfeng
2013-03-05 13:09:18 +08:00
用断点调试很容易发现这类错误,试试吧
RyanZhu
2013-03-07 19:31:02 +08:00
@cikelengfeng 调试不方便的。。递归算法没法watch。。。不过基本确定就是,栈没清干净。。。虽然还是没做出来。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/61846

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX