zoukankan      html  css  js  c++  java
  • 【转】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老师交流的美好时光。
  • 相关阅读:
    poj 2528 Mayor's posters (线段树+离散化)
    poj 1201 Intervals (差分约束)
    hdu 4109 Instrction Arrangement (差分约束)
    poj 1195 Mobile phones (二维 树状数组)
    poj 2983 Is the Information Reliable? (差分约束)
    树状数组 讲解
    poj 2828 Buy Tickets (线段树)
    hdu 1166 敌兵布阵 (树状数组)
    Ubuntu网络配置
    Button控制窗体变量(开关控制灯的状态)
  • 原文地址:https://www.cnblogs.com/kotete/p/7058224.html
Copyright © 2011-2022 走看看