4 使用内部类实现迭代器

在迭代器模式结构图中,我们可以看到具体迭代器类和具体聚合类之间存在双重关系,其中一个关系为关联关系,在具体迭代器中需要维持一个对具体聚合对象的引用,该关联关系的目的是访问存储在聚合对象中的数据,以便迭代器能够对这些数据进行遍历操作。

除了使用关联关系外,为了能够让迭代器可以访问到聚合对象中的数据,我们还可以将迭代器类设计为聚合类的内部类,JDK中的迭代器类就是通过这种方法来实现的,如下AbstractList类代码片段所示:

package java.util;
……
public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> {......private class Itr implements Iterator<E> {int cursor = 0;......
}
……
}

我们可以通过类似的方法来设计第3节中的ProductList类,将ProductIterator类作为ProductList类的内部类,代码如下所示:

//商品数据类:具体聚合类
class ProductList extends AbstractObjectList {public ProductList(List products) {super(products);}public AbstractIterator createIterator() {return new ProductIterator();}//商品迭代器:具体迭代器,内部类实现private class ProductIterator implements AbstractIterator {private int cursor1;private int cursor2;public ProductIterator() {cursor1 = 0;cursor2 = objects.size() -1;}public void next() {if(cursor1 < objects.size()) {cursor1++;}}public boolean isLast() {return (cursor1 == objects.size());}public void previous() {if(cursor2 > -1) {cursor2--;}}public boolean isFirst() {return (cursor2 == -1);}public Object getNextItem() {return objects.get(cursor1);} public Object getPreviousItem() {return objects.get(cursor2);}     }
}

无论使用哪种实现机制,客户端代码都是一样的,也就是说客户端无须关心具体迭代器对象的创建细节,只需通过调用工厂方法createIterator()即可得到一个可用的迭代器对象,这也是使用工厂方法模式的好处,通过工厂来封装对象的创建过程,简化了客户端的调用。

【作者:刘伟   http://blog.csdn.net/lovelion

转载于:https://www.cnblogs.com/pangblog/p/3262800.html

遍历聚合对象中的元素——迭代器模式(四)相关推荐

  1. 遍历聚合对象中的元素——迭代器模式

    本文转载自 :http://blog.csdn.net/lovelion/article/details/9992005 20世纪80年代,那时我家有一台"古老的"电视机,牌子我忘 ...

  2. 遍历聚合对象中的元素——迭代器模式(二)

    2 迭代器模式概述 在软件开发中,我们经常需要使用聚合对象来存储一系列数据.聚合对象拥有两个职责:一是存储数据:二是遍历数据.从依赖性来看,前者是聚合对象的基本职责:而后者既是可变化的,又是可分离的. ...

  3. 遍历聚合对象中的元素——迭代器模式(三)

    3 完整解决方案 为了简化AbstractObjectList类的结构,并给不同的具体数据集合类提供不同的遍历方式,Sunny软件公司开发人员使用迭代器模式来重构AbstractObjectList类 ...

  4. 如何正确遍历删除List中的元素,你会吗?

    遍历删除List中的元素有很多种方法,当运用不当的时候就会产生问题.下面主要看看以下几种遍历删除List中元素的形式: 1.通过增强的for循环删除符合条件的多个元素 2.通过增强的for循环删除符合 ...

  5. JS 遍历JSON对象中的键值对

    对象:一组无序属性的集合,属性的值可以是任意的类型: json也是对象,数据都是成对的,也就是键值对: json实际上就是一组格式化后的字符串数据. 遍历JSON对象中的数据,可通过for-in循环实 ...

  6. 设计模式在Netty中的应用-迭代器模式源码举例

    迭代器模式要点回顾 1. 实现迭代器接口 2. 实现对容器中的各个对象逐个访问的方法 public class CompositeByteBuf extends AbstractReferenceCo ...

  7. java遍历集合中的元素_java中如何遍历ArrayList集合中的元素并输出

    问题: 假设集合ArrayList中存储的元素是整形数字1~5,遍历每个元素,将每个元素顺序输出. 在线学习视频推荐:java教学视频 示例如下:package work10; import java ...

  8. java遍历list删除数据,遍历删除List中的元素方法

    red hat enterprise linux 8到图书 129.9元 (需用券) 去购买 > 1.通过增强的for循环删除符合条件的多个元素 /** * 使用增强的for循环 * 在循环过程 ...

  9. php 获取对象中的元素个数组长度,php数组长度怎么获取

    我们可以将元素添加到数组或从数组中删除元素,那么如果我们想要知道数组中存在的元素的总长度或总数,我们就可以使用count() 或sizeof函数. 下面我们就通过简单的示例,给大家介绍php获取数组长 ...

最新文章

  1. 对 Thinking in java 4th Edition I/O DirList.java的疑问
  2. Java Web开发乱码问题
  3. hdu1261 JAVA
  4. java 转xml 变成两根下划线_XStream将java对象转换为xml时,对象字段中的下划线“_”,转换后变成了两个...
  5. CentOS7中多台服务器配置时钟同步
  6. sigmoid function vs softmax function
  7. 公司支付给临时工的劳务费,无法取得发票如何做账?
  8. 51Nod-1640-天气晴朗的魔法(最小生成树)
  9. 第1章 通信网概述作业
  10. Java反射--实战篇
  11. WebGrid 在asp.net mvc中的使用和理解(译)
  12. python解析JSON数据
  13. IC卡防复制 设备联网 动态密钥方案说明 一卡通 门禁卡防破解Mifare卡低成本动态加密实现思路
  14. 华为主题引擎怎么下载_华为主题动态引擎
  15. 关于Ajax回调函数返回值判断的问题
  16. android 设置组件背景图片,Android TextView背景颜色与背景图片设置
  17. Java ServiceLoader使用和解析
  18. MySQL8.0 - 新特性 - Descending Index
  19. c#读取Excel表数据
  20. android 自定义图片裁剪,android 自定义比例裁剪图片(拍照 相册)方式 自定义比例...

热门文章

  1. c语言 自动化办公,办公自动化快捷键大全
  2. 10许可证即将到期_食品经营许可证延续
  3. gtihub第二次上传项目_国道岱山项目双合大桥墩柱桩基打桩施工突破100根
  4. docker安装mysql主从视频教程_docker安装mysql主从
  5. Mysql : InnoDB: Table flags are 0 in the data dictionary but the flags in file ./ibdata1 are 0x4800!
  6. TensorFlow相关工具
  7. Tether已在以太坊扩容方案Hermez Network上发行USDT
  8. TokenInsight:反映区块链行业整体表现的TI指数较昨日同期上涨1.37%
  9. 周小川:数字人民币不会取代美元 也不会威胁全球货币体系
  10. SAP License:SAP的2021关键词:协作