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

类型:行为类模式

类图:

       如果要问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. mysql select表达式_MySQL数据库SELECT查询表达式解析
  2. 【数据挖掘笔记二】认识数据
  3. 大数据读书笔记(2)-流式计算
  4. 一些来自STL的好东西
  5. android media apex_APEX英雄主播即将登陆时代广场?人气十强介绍!
  6. Mac安装tensorflow
  7. .Net WebApi接口之Swagger集成详解
  8. CORS跨域资源共享
  9. 51job简历如何导出pdf格式
  10. 关于51芯片及引脚功能介绍与总结
  11. 如何制作微信答题小程序(微信答题考试小程序开发制作功能介绍)
  12. 电脑键盘equals在哪个位置_学习第二步equals;equals;电脑键盘使用--快捷键大全
  13. 如何自学单片机? 单片机怎么入门?
  14. python学习之路day06
  15. 清华周界详解《基于图神经网络的事实验证》 | 百万人学AI
  16. 一、二、三代测序原理
  17. 每个人都需要良好的人生观、价值观、职业观
  18. java中length,length()和size()各自含义
  19. 幸福像花儿一样后悔又像什么呢——一个it最下层民工的自述
  20. 爬虫技巧整合(持续更新~)

热门文章

  1. 一种嵌套滑动冲突的解决方案
  2. HashMap的put和get操作
  3. js算法入门(2)--哈希表
  4. python版mapreduce题目实现寻找共同好友
  5. 数据库db_files参数增大怎么办
  6. 因热爱而编码,创造至美生活,挑战高效工作 阿里云智能开发者创新应用大赛全记录...
  7. Oracle单实例打补丁
  8. nginx视频直播/点播服务干货分享
  9. 分布式版本控制系统Git——使用GitStack+TortoiseGit 图形界面搭建Git环境(服务器端及客户端)(转)...
  10. C++基础8【难】 回顾:数组指针,函数指针,函数指针做函数参数 C语言多态