定义:提供一种方法访问一个容器对象中各个元素,而又不暴露该对象的内部细节。

类型:行为类模式

类图:

       如果要问java中使用最多的一种模式,答案不是单例模式,也不是工厂模式,更不是策略模式,而是迭代器模式,先来看一段代码吧:

public static void print(Collection coll){  Iterator it = coll.iterator();  while(it.hasNext()){  String str = (String)it.next();  System.out.println(str);  }
}  


  这个方法的作用是循环打印一个字符串集合,里面就用到了迭代器模式,java语言已经完整地实现了迭代器模式,Iterator翻译成汉语就是迭代器的意思。提到迭代器,首先它是与集合相关的,集合也叫聚集、容器等,我们可以将集合看成是一个可以包容对象的容器,例如List,Set,Map,甚至数组都可以叫做集合,而迭代器的作用就是把容器中的对象一个一个地遍历出来。

 

迭代器模式的结构

  • 抽象容器:一般是一个接口,提供一个iterator()方法,例如java中的Collection接口,List接口,Set接口等。
  • 具体容器:就是抽象容器的具体实现类,比如List接口的有序列表实现ArrayList,List接口的链表实现LinkList,Set接口的哈希列表的实现HashSet等。
  • 抽象迭代器:定义遍历元素所需要的方法,一般来说会有这么三个方法:取得第一个元素的方法first(),取得下一个元素的方法next(),判断是否遍历结束的方法isDone()(或者叫hasNext()),移出当前对象的方法remove(),
  • 迭代器实现:实现迭代器接口中定义的方法,完成集合的迭代。

 

代码实现

interface Iterator {  public Object next();  public boolean hasNext();
}
class ConcreteIterator implements Iterator{  private List list = new ArrayList();  private int cursor =0;  public ConcreteIterator(List list){  this.list = list;  }  public boolean hasNext() {  if(cursor==list.size()){  return false;  }  return true;  }  public Object next() {  Object obj = null;  if(this.hasNext()){  obj = this.list.get(cursor++);  }  return obj;  }
}
interface Aggregate {  public void add(Object obj);  public void remove(Object obj);  public Iterator iterator();
}
class ConcreteAggregate implements Aggregate {  private List list = new ArrayList();  public void add(Object obj) {  list.add(obj);  }  public Iterator iterator() {  return new ConcreteIterator(list);  }  public void remove(Object obj) {  list.remove(obj);  }
}
public class Client {  public static void main(String[] args){  Aggregate ag = new ConcreteAggregate();  ag.add("小明");  ag.add("小红");  ag.add("小刚");  Iterator it = ag.iterator();  while(it.hasNext()){  String str = (String)it.next();  System.out.println(str);  }  }
}  

上面的代码中,Aggregate是容器类接口,大家可以想象一下Collection,List,Set等,Aggregate就是他们的简化版,容器类接口中主要有三个方法:添加对象方法add、删除对象方法remove、取得迭代器方法iterator。Iterator是迭代器接口,主要有两个方法:取得迭代对象方法next,判断是否迭代完成方法hasNext,大家可以对比java.util.List和java.util.Iterator两个接口自行思考。

 

迭代器模式的优缺点

        迭代器模式的优点有:

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

        迭代器模式的缺点:

  • 对于比较简单的遍历(像数组或者有序列表),使用迭代器方式遍历较为繁琐,大家可能都有感觉,像ArrayList,我们宁可愿意使用for循环和get方法来遍历集合。

 

迭代器模式的适用场景

       迭代器模式是与集合共生共死的,一般来说,我们只要实现一个集合,就需要同时提供这个集合的迭代器,就像java中的Collection,List、Set、Map等,这些集合都有自己的迭代器。假如我们要实现一个这样的新的容器,当然也需要引入迭代器模式,给我们的容器实现一个迭代器。

       但是,由于容器与迭代器的关系太密切了,所以大多数语言在实现容器的时候都给提供了迭代器,并且这些语言提供的容器和迭代器在绝大多数情况下就可以满足我们的需要,所以现在需要我们自己去实践迭代器模式的场景还是比较少见的,我们只需要使用语言中已有的容器和迭代器就可以了。

java设计模式---迭代器模式相关推荐

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

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

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

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

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

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

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

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

  5. Java设计模式——迭代器模式

    概述 网上大部分人说迭代模式的时候,总是以某一种可遍历的对象为例进行介绍.这是可行的,这也是迭代模式的基本原型.当我看到<Head Frist设计模式>中迭代模式的时候,感觉要是能从另一个 ...

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

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

  7. 23种设计模式-迭代器模式《三国名将》

    对于许久不用的东西,容易忘记.百度许久,也未能找到自己所要. 从今日起,有些东西就记载下来,不仅方便自己,希望能帮到他人吧! 定义 提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部 ...

  8. Java 设计模式——状态模式

    概述 很多人在说状态模式的时候总拿策略模式来进行对比,可能他们的类图会有一点类似,可我却不认为他们有多么相像.你可以阅读<Java设计模式--策略模式>这篇博客,并与本文对比,以找到蛛丝马 ...

  9. Java设计模式——Builder模式

    前言 之前写Android程序的时候,经常会用到Dialog(对话框)这个控件.我们在使用Dialog,比如AlertDialog的时候就用到了这里要说明的Builder模式.现在我们来看一下这样的一 ...

最新文章

  1. 大数据的“近因偏差”烦恼
  2. DroidPilot 测试脚本详解 (一)
  3. Angular7教程-06-页面与数据交互
  4. 一篇文章带你解析,乐观锁与悲观锁的优缺点
  5. Android六边形图像
  6. 浅谈多线程——NSThread
  7. 计算机网络基础端口号,1 计算机网络基础练习
  8. 2019 ACM/ICPC 南京站 E.Observation,区间筛
  9. jsf tree组件_JSF UI组件标签属性示例教程
  10. Q115:Linux系统下CodeBlocks对PBRT-V3进行编译和调试
  11. 使用jQuery插件filtrify实现的超酷动态标签分类摩托车新款展示
  12. android 用gridview,Android GridView的使用
  13. cron表达式案例+cron在线生成器
  14. nginx配置长链接
  15. 2021有效的电子邮箱号码大全,外贸企业邮箱地址大全
  16. php域名绑定模块,ThinkPHP5.1 域名绑定模块
  17. 微信公众平台的STRUTS
  18. 浏览器中的data类型的Url格式,data:image/png,data:image/jpeg!
  19. 百万级PV高可用网站架构设计
  20. 如何设置U盘存储使其存储超过4G的文件

热门文章

  1. posix_kill 信号
  2. Linux下支持rz/sz上传下载文件
  3. Lucene in action 笔记 analysis篇
  4. 【Machine Learning】机器学习の特征
  5. 差异分析定位Ring 3保护模块
  6. html字体颜色代码表
  7. SD认证考题分布和复习要点(转摘)
  8. COGS2355 【HZOI2015】 有标号的DAG计数 II
  9. shell测试命令test、[ ]、[[ ]]
  10. Shell中的Wget 的用法