文章目录

  • 定义
  • 优点
  • 缺点
  • 模式的结构与实现
    • 模式的结构
    • 模式的实现
  • 应用场景

定义

  • 提供一种方法来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示。

迭代器模式是一种对象行为型模式


优点

  • 遍历任务交由迭代器完成,这简化了聚合类。
  • 访问一个聚合对象的内容而无须暴露它的内部表示。
  • 增加新的聚合类和迭代器类都很方便,无须修改原有代码。
  • 封装性良好,为遍历不同的聚合结构提供一个统一的接口。
  • 它支持以不同方式遍历一个聚合,甚至可以自定义迭代器的子类以支持新的遍历。

缺点

  • 增加了类的个数,这在一定程度上增加了系统的复杂性。

模式的结构与实现

迭代器模式是通过将聚合对象的遍历行为分离出来,抽象成迭代器类来实现的,其目的是在不暴露聚合对象的内部结构的情况下,让外部代码透明地访问聚合的内部数据。

模式的结构

有下面 4 个角色:

  • 抽象聚合角色】定义存储、添加、删除聚合对象以及创建迭代器对象的接口。
  • 具体聚合角色】实现抽象聚合类,返回一个具体迭代器的实例。
  • 抽象迭代器角色】定义访问和遍历聚合元素的接口,通常包含 hasNext()first()next() 等方法。
  • 具体迭代器角色】实现抽象迭代器接口中所定义的方法,完成对聚合对象的遍历,记录遍历的当前位置。

模式的实现

  • 抽象迭代器】,代码如下:
package com.example.designmodedemo.principle.iterator;/*** 抽象迭代器*/
public interface Iterator {Object first();Object next();boolean hasNext();}
  • 具体迭代器】,代码如下:
package com.example.designmodedemo.principle.iterator;import java.util.List;/*** 具体迭代器*/
public class MyIterator implements Iterator{private List<Object> list = null;private int index = -1;public MyIterator(List<Object> list) {this.list = list;}@Overridepublic Object first() {index = 0;if (list != null){return list.get(index);}return null;}@Overridepublic Object next() {if (list != null){return list.get(++index);}return null;}@Overridepublic boolean hasNext() {if (list != null){if (index < list.size() - 1){return true;}}return false;}
}
  • 抽象聚合角色】,代码如下:
package com.example.designmodedemo.principle.iterator;/*** 抽象聚合接口*/
public interface Aggregate {public void add(Object object);// 新增元素public void remove(Object object);// 移除元素public Iterator getIterator();// 获取迭代器}
  • 具体聚合角色】,代码如下:
package com.example.designmodedemo.principle.iterator;import java.util.ArrayList;
import java.util.List;/*** 具体聚合对象*/
public class MyAggregate implements Aggregate {private List<Object> list = new ArrayList<>();@Overridepublic void add(Object object) {list.add(object);}@Overridepublic void remove(Object object) {list.remove(object);}@Overridepublic Iterator getIterator() {return (new MyIterator(list));}
}
  • 客户端】,调用代码如下:
 /*** 迭代器模式*/private void principle_aggregate() {// 创建聚合对象,并添加元素Aggregate myAggregate = new MyAggregate();myAggregate.add("刺客信条 奥德赛");myAggregate.add("荒野大镖客2");myAggregate.add("巫师3");System.out.println(":> 聚合对象中内容如下:");// 获取迭代器对象,并遍历迭代器打印每一个元素内容Iterator myIterator = myAggregate.getIterator();while (myIterator.hasNext()){Object obj = myIterator.next();System.out.print(obj.toString() + "\t");}// 使用迭代器获取第一个元素Object firstObj = myIterator.first();System.out.println("\n:> First element is : " + firstObj.toString());}
  • 运行结果】,如下图示:


应用场景

  • 当需要为聚合对象提供多种遍历方式时。
  • 当需要为遍历不同的聚合结构提供一个统一的接口时。
  • 当访问一个聚合对象的内容而无须暴露其内部细节的表示时。

技术永不眠!我们下期见!

Java 设计模式之【迭代器】学习与掌握相关推荐

  1. 【Java设计模式】迭代器模式

    迭代器模式 1.概述 定义: 提供一个对象来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示. 2.结构 迭代器模式主要包含以下角色: 抽象聚合(Aggregate)角色:定义存储.添加.删 ...

  2. Java 设计模式之迭代器模式

    一.了解迭代器模式 1.1 什么是迭代器模式 迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示. 迭代器模式把游走的任务放在迭代器上,而不是聚合上.这样简化了聚合的接口和 ...

  3. Java设计模式之迭代器模式

    迭代器是针对集合对象而生的,对于集合对象而言,必然涉及到集合元素的添加删除操作,同时也肯定支持遍历集合元素的操作,我们此时可以把遍历操作也放在集合对象中,但这样的话,集合对象就承担太多的责任了,面向对 ...

  4. 迭代器 java_百战程序员:Java设计模式之迭代器模式

    迭代器是针对集合对象而生的,对于集合对象而言,必然涉及到集合元素的添加删除操作,同时也肯定支持遍历集合元素的操作,我们此时可以把遍历操作也放在集合对象中,但这样的话,集合对象就承担太多的责任了,面向对 ...

  5. JAVA设计模式什么鬼(迭代器)——作者:凸凹里歐

    方法迭代,代的更迭,从初代到末代的遍历,指对某类集合中的每个元素按顺序取出的行为.举个例子,通常我们读小说是从前往后翻,一页接着一页地读,这样我们才可以了解一个连续完整的故事,那这就需要我们顺序地迭代 ...

  6. Java设计模式中组合模式是什么/树形结构怎么组合或显示存储,编程怎么实现树形结构

    继续整理记录这段时间来的收获,详细代码可在我的Gitee仓库Java设计模式克隆下载学习使用! 5.7 组合模式 5.7.1 概述 又名整体模式,是用于把一组相似的对象当作一个单一的对象 依据树形结构 ...

  7. Java设计模式-中介模式/中介模式具体怎么使用,使用场景又是什么

    继续整理记录这段时间来的收获,详细代码可在我的Gitee仓库Java设计模式克隆下载学习使用! 6.8 中介者模式 6.8.1 定义 调停模式,定义一个中介角色来封装一系列对象的之间交互,使元有对象之 ...

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

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

  9. Java - 设计模式学习总结

    熟练掌握各种设计模式,并能在实际编程开发中灵活运用它们,不仅能使代码更规范,重用性更高,同时也能保证代码的可靠性,提高开发效率.这段时间又系统看了设计模式的相关内容,整理学习总结如下,文中内容如有表达 ...

  10. JAVA设计模式(21):行为型-迭代器模式(Iterator)

    20世纪80年代,那时我家有一台"古老的"电视机,牌子我忘了,只记得是台黑白电视机,没有遥控器,每次开关机或者换台都需要通过电视机上面的那些按钮来完成,我印象最深的是那个用来换台的 ...

最新文章

  1. 图像配准----SIFT
  2. mysql判断是否建立索引_判断mysql中列是否要添加索引的标准
  3. LDAP-轻量级目录访问协议(统一认证)
  4. 奥的斯服务器显示chc,奥的斯服务器查看故障清除故障
  5. 华为今年不发布Mate系列新机;一加宣布与OPPO合并:将成为OPPO旗下独立品牌;Gradle 7.1 发布|极客头条...
  6. “无代码”来了,还要程序员干嘛?
  7. PAT 1066. 图像过滤(15)-乙级
  8. 懒惰是人类进步的动力,勤奋是实现偷懒的途径
  9. exec调用oracle,exec 和 call 用法详解
  10. UISegmentedControl
  11. taskfactory默认执行慢的问题
  12. eBay把平台更新为Kubernetes、Envoy和Kafka:计划开源硬件和软件
  13. intellij idea设置主题、字体样式和背景色
  14. 方维团购V3.07版本短信接口开发
  15. 什么是Handler
  16. 6612345免费网页打印浏览器
  17. Linux发行版本及其区别
  18. VSPD虚拟串口工具无法删除添加的虚拟串口
  19. 快捷下载中国原创音乐基地音乐(包括金豆和无法下载音乐)
  20. 导航网站合集|高效工作学习

热门文章

  1. 国仁网络资讯:微信视频号最佳黄金比例是多少?千万别搞错了。
  2. 重磅 | Stratifyd发布《奢侈品 · 包袋客户体验洞察报告》附下载
  3. 微震生命探测仪价格是多少,可以使用在哪些地方。
  4. 笔记本系统盘文件如何恢复
  5. install wubi
  6. Ubuntu日常使用问题杂记
  7. OD调试的程序无法处理例外
  8. 三农优购隐私政策服务协议
  9. 入门Mysql(弱鸡待更)
  10. 建站宝盒——最适合中小企业的免费建站工具