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老师交流的美好时光。

最新文章

  1. 很多事情就像看A片,看的人觉得很爽,做的人未必。
  2. Distribute numbers to two “containers” and minimize their difference of sum
  3. jquery选择器效率优化问题
  4. Commons IO - IOUtils
  5. Dedecms调用文章发布时间的方法
  6. 关于sencha touch 的JSONP跨域请求的学习研究
  7. 黑马程序员 Java基础&lt;十八&gt;---&gt; 网路编程
  8. Java 中的语法糖
  9. Caused by:java.sql.SQLException:ORA-00923
  10. 快速去水印(win10换图3D工具)
  11. java提高(9)---HashMap解析
  12. 2018 Multi-University Training Contest 2 杭电多校第二场
  13. 《剑指offer》-判断平衡二叉树
  14. mkdir -p a/b 表示创建目录a,并创建目录a的子目录b
  15. ubuntu下唤醒或休眠远程计算机
  16. 有关cookies与session的详细信息
  17. Fluent UDF【7】:解释型UDF
  18. error: insufficient permissions for device(解决adb shell问题)
  19. Spring4.X + spring MVC + Mybatis3 零配置应用开发框架搭建详解(1) - 基本介绍
  20. mysql服务器参数

热门文章

  1. .pcd格式点云文件的显示
  2. tfield的字段名和显示名
  3. 实战Arch Unit
  4. clonezilla使用说明
  5. centos 7 内存压测测试--memtester工具
  6. [RoarCTF 2019]Easy Java
  7. javaweb03 javaservlet基础一
  8. C语言-指针到底是什么?
  9. Python实现Collatz序列(考拉兹猜想)
  10. Redis5新特性Streams作消息队列