【转】HeadFirst 组合模式+迭代器错误原因以及解决代码
主函数中waitress.printVegetarianMenu();
调用的代码中有 Iterator iter = allMenus.createIterator();
动态绑定到:
这时CompositeIterator中的栈初始化,并向里面添加了一个迭代器。
这时,向栈添加的迭代器为ArrayList<MenuComponent> menuComponents的迭代器,即ArrayList的iterator()。
而当开始遍历这个迭代器时,
调用这个iter.next()时,调用这段代码:
其中,如果现在遍历到的项不是叶子节点,则往栈里面push一个component.createIterator()。
此时,问题出现了,这里向栈里面添加的是CompositeIterator类型的迭代器,迭代器中的栈里为ArrayList的iterator()。
这就是造成叶子节点出现遍历多次的原因。
课本代码测试结果为:
所以,应该保证加入CompositeIterator中栈里的元素全为链表的迭代器。
解决办法:
这时,我在MenuComponent抽象类中添加方法
在其子类Menu中对其进行重写,返回它自身的链表。
在CompositeIterator迭代器中,next方法中对当前元素为非叶子节点的,采取
更改后的代码测试结果为:
问题解决了。
测试数据树结构如下图: