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

【转】HeadFirst 组合模式+迭代器错误原因以及解决代码的更多相关文章

  1. coreseek常见错误原因及解决方法

    coreseek常见错误原因及解决方法 Coreseek 中文全文检索引擎 Coreseek 是一款中文全文检索/搜索软件,以GPLv2许可协议开源发布,基于Sphinx研发并独立发布,专攻中文搜索和 ...

  2. ORA-04091错误原因与解决方法

    最近工作中写了一触发器报错:ORA-04091:table XX  is mutating, trigger/function may not see it. 下面通过官方文档及网友提供资料分析一下错 ...

  3. /usr/bin/ld: cannot find -lc错误原因及解决方法

    问题解决 我在执行如下命令的时候,出现了错误. gcc -o main main.c -static -L. –lmylib Linux环境下gcc静态编译/usr/bin/ld: cannot fi ...

  4. 【翻译自mos文章】使用aum( Automatic Undo Management) 时遇到 ORA-01555错误--- 原因和解决方式。

    使用aum( Automatic Undo Management) 时遇到 ORA-01555错误--- 原因和解决方式. 參考原文: ORA-01555 Using Automatic Undo M ...

  5. [转]PLS-S-00201, identifier 'CALLDEMO.GET_EMPLOYEES' must be declared 预编译错误原因及解决办法

    $ proc sample9.pc SQLCHECK=SEMANTICS Pro*C/C++: Release 11.2.0.1.0 - Production on Tue Jan 8 15:18:4 ...

  6. SpringBoot+Shiro引起事务失效、错误原因、解决方法

    一.问题今天发现用户注册的Service的事务并没有起到作用,再抛出一个RuntimeException后,并没有发生回滚,下面是调试步骤: 1.检查数据库的引擎是否是innoDB 2.启动类上是否加 ...

  7. javascript中出现identifier starts immediately after numeric literal错误原因以及解决方法

    javascript遇到参数是字符型和数字型组合的参数就会出现这种错误,例如alert(1);可以正確輸出alert(str);就會報錯alert("str");可以正確輸出.

  8. 0x800a138f - JavaScript runtime error: Unable to get property 'asSorting' of undefined or null reference 错误原因以及解决办法

    使用Jquery Datatables的时候也许会碰到这样的错误提示,当我们仔细的查找代码,发现引用的js文件,css文件均引用了,就是找不到他的问题所在. 这是从我们引用的js文件内部报的错. 这个 ...

  9. 【hadoop】 running beyond virtual memory错误原因及解决办法

    问题描述: 在hadoop中运行应用,出现了running beyond virtual memory错误.提示如下: Container [pid=28920,containerID=contain ...

随机推荐

  1. Ubuntu13.04闪屏的问题

    我的电脑Y460,双显切换,win7+ubuntu双系统,就是这个坑爹的双显切换,导致安装ubuntu13.04后屏老闪,网上查阅资料得知是显卡问题,一种是说显卡驱动问题,一种是说双显卡问题,双显卡问 ...

  2. Git 小课堂 002——别名

    昨天我们聊了聊 Git 的文件存储,今天我们聊聊 Git 的别名.不知道你是不是熟悉别名,如果你经常使用命令行做一些事情,有一些复杂的命令,或者是一些简单的操作,往往用一些别名方法就很方便很容易,下面 ...

  3. PHP SeasLog实现高性能日志记录

    https://www.jianshu.com/p/b5c01eb49df0 windows 安装 注意查看上面的信息 我标注了几个关键点  然后下载自己对应的 https://windows.php ...

  4. 吴裕雄--天生自然 JAVASCRIPT开发学习:测试 jQuery

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  5. MyBatis项目报错:The server time zone value '�й�׼' is unrecognized or represents more than one time zone

    问题来源:在部署Spring + MyBatis项目的时候,运行时报错The server time zone value '�й�׼' is unrecognized or represents m ...

  6. 三、VIP课程:并发编程专题->01-并发编程之Executor线程池详解

    01-并发编程之Executor线程池详解 线程:什么是线程&多线程 线程:线程是进程的一个实体,是 CPU 调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系 ...

  7. PAT Advanced 1145 Hashing – Average Search Time (25) [哈希映射,哈希表,平⽅探测法]

    题目 The task of this problem is simple: insert a sequence of distinct positive integers into a hash t ...

  8. C/C++ 取整函数ceil(),floor()

    使用floor函数.floor(x)返回的是小于或等于x的最大整数.如:     floor(10.5) == 10    floor(-10.5) == -11 使用ceil函数.ceil(x)返回 ...

  9. tensorflow deeplabv3 训练自己的数据集

    https://blog.csdn.net/malvas/article/details/90776327

  10. 翻译——1_Project Overview, Data Wrangling and Exploratory Analysis-checkpoint

    为提高提高大学能源效率进行建筑能源需求预测 本文翻译哈佛大学的能源分析和预测报告,这是原文 暂无数据源,个人认为学习分析方法就足够 内容: 项目概述 了解数据 探索性分析 使用不同的机器学习方法进行预 ...