介绍

根据GoF的定义,迭代器模式提供了一种顺序访问聚合对象的元素而不暴露其底层表示的方法。这是一种行为设计模式。

顾名思义,迭代器有助于以定义的方式遍历对象集合,这对客户端应用程序很有用。在迭代期间,客户端程序可以根据需求对元素执行各种其他操作。

原理类图


迭代器模式的角色说明如下:

  • Iterator:访问或遍历元素集合的接口。提供具体迭代器必须实现的方法。

  • ConcreteIterator:实现Iterator接口方法。它还可以跟踪聚合集合遍历中的当前位置。

  • Aggregate:它通常是一个集合接口,它定义了一个可以创建迭代器对象的方法。

  • ConcreteAggregate:它实现Aggregate接口,其特定方法返回- -ConcreteIterator的实例。

什么时候使用?

每种编程语言都支持一些数据结构,如列表或映射,用于存储一组相关对象。在Java中,我们有List、Map和Set接口及其实现,如ArrayList和HashMap。

只有当集合提供了访问其元素而不暴露其内部结构的方法时,它才有用。迭代器承担这一责任。

因此,无论何时,我们都有对象集合,并且客户端需要一种方法以适当的顺序迭代每个集合元素,我们必须使用迭代器模式来设计解决方案。

迭代器模式允许我们以如下方式设计集合迭代器:

  • 我们能够访问集合的元素,而不暴露元素的内部结构或集合本身。
  1. 迭代器支持在向前、向后或两个方向上从开始到结束对集合进行多次同时遍历。

  2. 迭代器为透明地遍历不同的集合类型提供了统一的接口。

JDK中的实现

在Java中,我们有Java.util.Iterator接口及其特定的实现,例如ListIterator。所有Java集合都提供了Iterator接口的一些内部实现,该接口用于迭代集合元素。

List<String> names = Arrays.asList("alex", "brian", "charles");

  Iterator<String> namesIterator = names.iterator();

  while (namesIterator.hasNext())
{
String currentName = namesIterator.next(); System.out.println(currentName);
}

实战案例

在这个迭代器模式示例中,我们正在创建一个集合,该集合可以保存Topic类的实例,并将提供一个迭代器来按顺序迭代Topic集合。

public class Topic
{
private String name; public Topic(String name) {
super();
this.name = name;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
}
}
public interface Iterator<E>
{
void reset(); // reset to the first element E next(); // To get the next element E currentItem(); // To retrieve the current element boolean hasNext(); // To check whether there is any next element or not.
}
public class TopicIterator implements Iterator<Topic> {

  private Topic[] topics;
private int position; public TopicIterator(Topic[] topics)
{
this.topics = topics;
position = 0;
} @Override
public void reset() {
position = 0;
} @Override
public Topic next() {
return topics[position++];
} @Override
public Topic currentItem() {
return topics[position];
} @Override
public boolean hasNext() {
if(position >= topics.length)
return false;
return true;
}
}
public interface List<E>
{
Iterator<E> iterator();
}
public class TopicList implements List<Topic>
{
private Topic[] topics; public TopicList(Topic[] topics)
{
this.topics = topics;
} @Override
public Iterator<Topic> iterator() {
return new TopicIterator(topics);
}
}
public class Main
{
public static void main(String[] args)
{
Topic[] topics = new Topic[5];
topics[0] = new Topic("topic1");
topics[1] = new Topic("topic2");
topics[2] = new Topic("topic3");
topics[3] = new Topic("topic4");
topics[4] = new Topic("topic5"); List<Topic> list = new TopicList(topics); Iterator<Topic> iterator = list.iterator(); while(iterator.hasNext()) {
Topic currentTopic = iterator.next();
System.out.println(currentTopic.getName());
}
}
}
  • 程序输出:

Java设计模式-迭代器模式Iterator的更多相关文章

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

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

  2. java设计模式——迭代器模式

    一. 定义与类型 定义:提供一种方法,顺序访问一个集合对象中的各个元素,而又不暴露该对象的内部表示 类型:行为型. 二. 使用场景 (1) 访问一个集合对象的内容而无需暴露它的内部表示 (2)  为遍 ...

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

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

  4. javascript设计模式-迭代器模式(Iterator)

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. 设计模式 -- 迭代器模式(Iterator)

    --------------------------------------------------------------------- 1.场景问题 考虑这样一个问题: 9个学生对象分别通过数组存 ...

  6. Java设计模式の迭代器模式

    迭代器模式定义 迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示. 迭代器模式的角色构成 (1)迭代器角色(Iterator):定义遍历元素所需 ...

  7. C#设计模式——迭代器模式(Iterator Pattern)

    一.概述在软件开发过程中,我们可能会希望在不暴露一个集合对象内部结构的同时,可以让外部代码透明地访问其中包含的元素.迭代器模式可以解决这一问题.二.迭代器模式迭代器模式提供一种方法顺序访问一个集合对象 ...

  8. JAVA设计模式---迭代器模式

    1.定义: 提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示. 2.实例:1)需求: 菜单(煎饼屋菜单.餐厅菜单和咖啡菜单)采用不同的集合存取(ArrayList,String[] ...

  9. java设计模式----迭代器模式和组合模式

    迭代器模式: 提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示. 设计原则: 单一责任:一个类应该只有一个引起变化的原因 组合模式: 允许你将对象组合成树形结构来表现“整体/部分” ...

  10. Java 设计模式系列(十五)迭代器模式(Iterator)

    Java 设计模式系列(十五)迭代器模式(Iterator) 迭代器模式又叫游标(Cursor)模式,是对象的行为模式.迭代子模式可以顺序地访问一个聚集中的元素而不必暴露聚集的内部表象(interna ...

随机推荐

  1. RabbitMQ .net core 客户端 EasyNetQ 的使用

    依赖注入 var connectionConfiguration = new ConnectionConfiguration { Hosts = new List<HostConfigurati ...

  2. [转帖]修改Linux内核参数,减少TCP连接中的TIME-WAIT

    https://www.cnblogs.com/xiaoleiel/p/8340346.html 一台服务器CPU和内存资源额定有限的情况下,如何提高服务器的性能是作为系统运维的重要工作.要提高Lin ...

  3. Oceanbase开源版 数据库恢复MySQL数据库的过程

    # Oceanbase开源版 数据库恢复MySQL数据库的过程 背景 想进行一下Oceanbase数据库的兼容性验证. 想着用app create 数据库的方式周期比较长. 所以我想着换一套 备份恢复 ...

  4. [转帖]SQL SERVER中隐式转换的一些细节浅析

    https://www.cnblogs.com/kerrycode/p/5853257.html 其实这是一篇没有技术含量的文章,精通SQL优化的请绕道.这个缘起于在优化一个SQL过程中,同事问了我一 ...

  5. [转帖]Nginx四层负载均衡详解

    https://developer.aliyun.com/article/885599?spm=a2c6h.24874632.expert-profile.315.7c46cfe9h5DxWK 202 ...

  6. [转贴]CPU设计全流程-以Alpha为例

    https://zhuanlan.zhihu.com/p/529872958 1.前言 作为一种超大规模集成电路,CPU在过去几十年里始终遵循摩尔定律--每过十八到二十四个月,硅片单位面积上晶体管数量 ...

  7. [知乎]聊一聊threadlocal

    作者:李二狗链接:https://www.zhihu.com/question/341005993/answer/1996544027来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载 ...

  8. echarts去掉y轴线、设置x轴线的颜色、x轴文字颜色

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  9. css3中的圆角border-radius

    css3的属性应该加上浏览器前缀 不同的浏览器内核不同,因此css的前缀不同. 常见的几种浏览器内核 火狐浏览器 Geoko内核 前缀是 -mox- 谷歌浏览器, Webkit内核 前缀是 -wekb ...

  10. axios取消请求

    为什么会有取消请求-文件上传 比如有这样的场景,在一个弹窗中有文件上传. 当用户进行文件上传的时候,发现不想进行文件上传了,又点击了弹窗中的取消. 那么是不是应该去取消本次的上传操作,此时就需要使用取 ...