【转】HeadFirst 组合模式+迭代器错误原因以及解决代码
2024-10-08 18:24:11
http://blog.csdn.net/sugar_girl/article/details/53400267
《HeadFirst JAVA设计模式》中用迭代器迭代组合模式是存在错误的,课本中的代码实现对于大于两层的树状数据跑出来会出错(即Menu里有Menu),经过长时间的思想斗争,得到了错误原因和解决代码。
分析课本代码:
主函数中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方法中对当前元素为非叶子节点的,采取
更改后的代码测试结果为:
问题解决了。
测试数据树结构如下图:
一劳永逸的项目压缩包链接:HeadFirst 组合模式+迭代器错误原因以及解决代码
以此纪念与JAVA老师交流的美好时光。
最新文章
- 很多事情就像看A片,看的人觉得很爽,做的人未必。
- Distribute numbers to two “containers” and minimize their difference of sum
- jquery选择器效率优化问题
- Commons IO - IOUtils
- Dedecms调用文章发布时间的方法
- 关于sencha touch 的JSONP跨域请求的学习研究
- 黑马程序员 Java基础<;十八>;--->; 网路编程
- Java 中的语法糖
- Caused by:java.sql.SQLException:ORA-00923
- 快速去水印(win10换图3D工具)
- java提高(9)---HashMap解析
- 2018 Multi-University Training Contest 2 杭电多校第二场
- 《剑指offer》-判断平衡二叉树
- mkdir -p a/b 表示创建目录a,并创建目录a的子目录b
- ubuntu下唤醒或休眠远程计算机
- 有关cookies与session的详细信息
- Fluent UDF【7】:解释型UDF
- error: insufficient permissions for device(解决adb shell问题)
- Spring4.X + spring MVC + Mybatis3 零配置应用开发框架搭建详解(1) - 基本介绍
- mysql服务器参数