Java设计模式之迭代器模式_动力节点Java学院整理

发布时间 - 2026-01-11 02:49:01    点击率:

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

类型:行为类模式

类图:

       如果要问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设计模式之迭代器模式_动力节点Java学院整理,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!


# java  # 设计模式  # 迭代器模式  # Java设计模式之迭代器模式  # 深入理解Java设计模式之迭代器模式  # Java设计模式之java迭代器模式详解  # 详解Java设计模式——迭代器模式  # 23种设计模式(14)java迭代器模式  # Java使用设计模式中迭代器模式构建项目的代码结构示例  # 使用迭代器模式来进行Java的设计模式编程  # Java设计模式中的迭代器模式详解  # 迭代  # 遍历  # 是一个  # 都有  # 就可以  # 只需要  # 小编  # 自己的  # 判断是否  # 他们的  # 会有  # 就像  # 第一个  # 最多  # 在此  # 两种  # 只需  # 给我们  # 它是  # 我们可以 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何制作一个表白网站视频,关于勇敢表白的小标题?  Chrome浏览器标签页分组怎么用_谷歌浏览器整理标签页技巧【效率】  Laravel如何使用Service Provider服务提供者_Laravel依赖注入与容器绑定【深度】  电商网站制作价格怎么算,网上拍卖流程以及规则?  Laravel怎么进行数据库事务处理_Laravel DB Facade事务操作确保数据一致性  iOS验证手机号的正则表达式  网站制作价目表怎么做,珍爱网婚介费用多少?  javascript如何操作浏览器历史记录_怎样实现无刷新导航  在线制作视频网站免费,都有哪些好的动漫网站?  laravel怎么通过契约(Contracts)编程_laravel契约(Contracts)编程方法  如何挑选最适合建站的高性能VPS主机?  简历在线制作网站免费版,如何创建个人简历?  Python图片处理进阶教程_Pillow滤镜与图像增强  Laravel如何使用Contracts(契约)进行编程_Laravel契约接口与依赖反转  Laravel Fortify是什么,和Jetstream有什么关系  实例解析angularjs的filter过滤器  Java垃圾回收器的方法和原理总结  如何快速搭建高效WAP手机网站?  java ZXing生成二维码及条码实例分享  香港网站服务器数量如何影响SEO优化效果?  如何破解联通资金短缺导致的基站建设难题?  laravel怎么在请求结束后执行任务(Terminable Middleware)_laravel Terminable Middleware请求结束任务执行方法  Mybatis 中的insertOrUpdate操作  如何正确选择百度移动适配建站域名?  公司门户网站制作流程,华为官网怎么做?  Zeus浏览器网页版官网入口 宙斯浏览器官网在线通道  如何用搬瓦工VPS快速搭建个人网站?  Laravel怎么配置S3云存储驱动_Laravel集成阿里云OSS或AWS S3存储桶【教程】  什么是JavaScript解构赋值_解构赋值有哪些实用技巧  浅谈redis在项目中的应用  Laravel如何连接多个数据库_Laravel多数据库连接配置与切换教程  Laravel如何生成URL和重定向?(路由助手函数)  如何快速搭建个人网站并优化SEO?  Linux后台任务运行方法_nohup与&使用技巧【技巧】  EditPlus 正则表达式 实战(3)  Laravel distinct去重查询_Laravel Eloquent去重方法  Laravel Livewire是什么_使用Laravel Livewire构建动态前端界面  利用vue写todolist单页应用  头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?  php json中文编码为null的解决办法  Java遍历集合的三种方式  韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐  Windows11怎样设置电源计划_Windows11电源计划调整攻略【指南】  Laravel怎么返回JSON格式数据_Laravel API资源Response响应格式化【技巧】  如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?  JavaScript如何实现继承_有哪些常用方法  javascript基本数据类型及类型检测常用方法小结  google浏览器怎么清理缓存_谷歌浏览器清除缓存加速详细步骤  Edge浏览器提示“由你的组织管理”怎么解决_去除浏览器托管提示【修复】  Android使用GridView实现日历的简单功能