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老师交流的美好时光。
  • 相关阅读:
    html5 localstorage本地存储
    如何在源码里修改openwrt root密码
    openwrt-scripts/config/mconf: Syntax error: “(” unexpected错误解决
    HTML5获取地理位置信息
    Mysql 查看连接数,状态 最大并发数(赞)
    晨读笔记:CSS3选择器之属性选择器
    CSS3选择器之属性选择器
    js判断浏览器类型
    javascript json字符串与对象相互转换
    手机端html5触屏事件(touch事件)
  • 原文地址:https://www.cnblogs.com/kotete/p/7058224.html
Copyright © 2011-2022 走看看