【转】HeadFirst 组合模式+迭代器错误原因以及解决代码

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

转载于:https://www.cnblogs.com/kotete/p/7058224.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值