欢迎支持笔者新作:《深入理解Kafka:核心设计与实践原理》和《RabbitMQ实战指南》,同时欢迎关注笔者的微信公众号:朱小厮的博客。


欢迎跳转到本文的原文链接:https://honeypps.com/design_pattern/iterator/

提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示。又称游标(Cursor)模式

迭代器模式角色组成:

  1. 抽象容器角色(Aggregate):负责提供创建具体迭代器角色的接口,一般是一个接口,提供一个iterator()方法,例如java中的Collection接口,List接口,Set接口等。
  2. 具体容器角色(ConcreteAggregate):就是实现抽象容器的具体实现类,比如List接口的有序列表实现ArrayList,List接口的链表实现LinkedList,Set接口的哈希列表的实现HashSet等。
  3. 抽象迭代器角色(Iterator):负责定义访问和遍历元素的接口。
  4. 具体迭代器角色(ConcreteIterator):实现迭代器接口,并要记录遍历中的当前位置。

举个简单案例
1 Iterator

public interface Iterator
{public Object next();public boolean hasNext();
}

2 ConcreteIterator

public class ConcreteIterator implements Iterator
{private List<Object> list = Collections.emptyList();private int current = 0;public ConcreteIterator(List<Object> list){this.list = list;}@Overridepublic Object next(){Object obj = null;if(this.hasNext()){obj = this.list.get(current++);}return obj;}@Overridepublic boolean hasNext(){if(current == list.size()){return false;}return true;}
}

3 Aggregate

public interface Aggregate
{public void add(Object obj);public void remove(Object obj);public Iterator iterator();
}

4 ConcreteAggregate

public class ConcreteAggregate implements Aggregate
{private List<Object> list = new ArrayList<>();@Overridepublic void add(Object obj){list.add(obj);}@Overridepublic void remove(Object obj){list.remove(obj);}@Overridepublic Iterator iterator(){return new ConcreteIterator(list);}
}

5 测试代码

        Aggregate ag = new ConcreteAggregate();ag.add("zzh");ag.add("jj");ag.add("qq");Iterator it = ag.iterator();while(it.hasNext()){System.out.println(it.next());}

输出:

zzh
jj
qq

优缺点
优点:

  1. 简化了遍历方式,对于对象集合的遍历,还是比较麻烦的,对于数组或者有序列表,我们尚可以通过游标来取得,但用户需要在对集合了解很清楚的前提下,自行遍历对象,但是对于hash表来说,用户遍历起来就比较麻烦了。而引人了迭代器方法后,用户用起来就简单的多了。
  2. 可以提供多种遍历方式,比如说对有序列表,我们可以根据需要提供正序遍历,倒序遍历两种迭代器,用户用起来只需要得到我们实现好的迭代器,就可以方便的对集合进行遍历了。
  3. 封装性良好,用户只需要得到迭代器就可以遍历,而对于遍历算法则不用去关心。

缺点:

  1. 对于比较简单的遍历(像数组或者有序列表),使用迭代器方式遍历较为繁琐,比如ArrayList,用for循环的方式遍历会更好一点,详细可以参考《Java集合框架:ArrayList》

适用场景
 迭代器模式是与集合共生共死的,一般来说,我们只要实现一个集合,就需要同时提供这个集合的迭代器,就像Java中的Collection,List,Set,Map等,这些集合都有自己的迭代器。假如我们要实现一个这样的新的容器,当然也需要引入迭代器模式,给我们的容器实现一个迭代器。但是,由于容器与迭代器的关系太密切了,所以大多数语言在实现容器的时候都给提供了迭代器,并且这些语言提供的容器和迭代器在绝大多数情况下就可以满足我们的需要,所以现在需要我们自己取实践迭代器模式的场景还是比较少见的,我们只需要使用语言中已有的容器和迭代器就可以了。


参考资料

  1. 《23种设计模式》
  2. 《23种设计模式(13):迭代器模式》
  3. 《Java集合框架:ArrayList》

欢迎跳转到本文的原文链接:https://honeypps.com/design_pattern/iterator/

欢迎支持笔者新作:《深入理解Kafka:核心设计与实践原理》和《RabbitMQ实战指南》,同时欢迎关注笔者的微信公众号:朱小厮的博客。


设计模式:迭代器模式(Iterator)相关推荐

  1. 设计模式 - 迭代器模式(iterator pattern) 具体解释

    迭代器模式(iterator pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 迭代器模式(iterator pattern) : 提供一 ...

  2. 设计模式:迭代器模式(Iterator Pattern)

    迭代器模式(Iterator Pattern): 属于行为型模式,提供一种遍历集合元素的统一接口,用一致的方法遍历集合元素,不需要知道集合对象的底层表示,即: 不暴露其内部结构.

  3. 解读设计模式----迭代器模式(Iterator Pattern),谁才是迭代高手

    一.你在开发中使用过迭代吗?      当你在使用JavaScript开发客户端应用的时候使用过for...in吗?  1<script type="text/javascript&q ...

  4. java设计模式迭代器模式_Java中的迭代器设计模式

    java设计模式迭代器模式 Iterator design pattern in one of the behavioral pattern. Iterator pattern is used to ...

  5. 设计模式 ( 十四 ) 迭代器模式Iterator(对象行为型)

    设计模式 ( 十四 ) 迭代器模式Iterator(对象行为型) 1.概述 类中的面向对象编程封装应用逻辑.类,就是实例化的对象,每个单独的对象都有一个特定的身份和状态.单独的对象是一种组织代码的有用 ...

  6. c++迭代器模式iterator

    c++迭代器模式iterator 概念 角色和职责 案例 概念 Iterator模式也叫迭代模式,是行为模式之一,它把对容器中包含的内部对象的访问委让给外部类,使用Iterator(遍历)按顺序进行遍 ...

  7. java设计模式迭代器模式_迭代器设计模式示例

    java设计模式迭代器模式 本文是我们名为" Java设计模式 "的学院课程的一部分. 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们. 您将了解模式 ...

  8. java设计模式迭代器模式_Java中的迭代器设计模式–示例教程

    java设计模式迭代器模式 迭代器模式是一种行为模式,它用于提供遍历一组对象的标准方式. Iterator模式在Java Collection Framework中得到了广泛使用,其中Iterator ...

  9. java设计模式迭代器模式_迭代器模式和Java

    java设计模式迭代器模式 大家好,在本文中,我们将检查Iterator Pattern . 我知道你们中许多人已经使用过一种设计模式,但是也许您没有意识到它是模式,或者不知道它的巨大价值. 根据&l ...

  10. JAVA 设计模式 迭代器模式

    用途 迭代器模式 (Iterator) 提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示. 迭代器模式是一种行为型模式. 结构 图-迭代器模式结构图 Iterator : 定义访 ...

最新文章

  1. 介绍下计算机的一些常识?
  2. 2018秋寒假作业6—PTA编程总结3
  3. Packet Tracer 5.0配置cisco路由器详细说明
  4. 北信源携手天津麒麟共建国产信息安全
  5. html5垂直线怎么画,HTML5 Canvas画线技巧
  6. 用计算机参加关于动漫的工作计划,动漫社团年度工作计划
  7. python中valueerror怎么改_Python:ValueError:使用序列设置数组元素
  8. html2bin.exe,hex转换成bin文件小工具(HEX2BIN.EXE)
  9. 怎么用计算机打游戏视频,如何录制电脑上正在玩的游戏视频
  10. Python分析捕食者和被捕食者模型 Lotka--Volterra方程 | 拟合求解a,b,c,d
  11. linux 对战平台,【浩方对战平台和搜狗输入法 For Linux哪个好用】浩方对战平台和搜狗输入法 For Linux对比-ZOL下载...
  12. 更换电脑机械硬盘之后,无需重新安装程序技巧(系统盘为固态),解决D盘程序快捷方式图标白色方块
  13. Matlab求解微分方程数值解
  14. 啊啊啊啊啊啊啊啊啊啊啊啊啊啊(一篇自述)
  15. 【剑指 Offer_15】二进制中1的个数_PythonJava_逐位相与解法
  16. 百度关键词排名查询源码_百度推广优化技巧,百度搜索关键词排名优化
  17. JNI 之Java和c/c++交互,提升Java变成效率
  18. STM32+多通道模拟输入+MQTT+RTC+OLED显示屏+RFID门禁
  19. 定义一个图形类及其子类,计算其面积和周长
  20. 不知道O2O产品的APP该如何运营推广?

热门文章

  1. 区块链相关数据报表_重磅|京东云区块链数据服务(BDS)正式开源
  2. 加载torchvision中预训练好的模型并修改默认下载路径
  3. SAP Cloud for Customer使用移动设备访问系统的硬件要求
  4. 关于My Sql update语句不能用子查询的解决办法
  5. android中ScrollView嵌套ListView或GridView显示位置问题
  6. 备库设置read_only被阻塞
  7. HAProxy + Keepalived + Flume 构建高性能高可用分布式日志系统
  8. Chrome浏览器对我的改变
  9. 如何监控和提高IIS的性能
  10. HDU - 2457 DNA repair(AC自动机+dp)