大数据知识体系
首页
数据结构与算法
  • JVM
  • Java
  • Scala
  • Python
设计模式
  • MySQL
  • Redis
  • HDFS
  • HBase
  • ClickHouse
  • ElasticSearch
  • Iceberg
  • Hudi
  • Spark
  • Flink
  • Hive
  • Yarn
  • Zookeeper
  • Maven
  • Git
  • 数据仓库
  • 用户画像
  • 指标体系
数据治理
关于
首页
数据结构与算法
  • JVM
  • Java
  • Scala
  • Python
设计模式
  • MySQL
  • Redis
  • HDFS
  • HBase
  • ClickHouse
  • ElasticSearch
  • Iceberg
  • Hudi
  • Spark
  • Flink
  • Hive
  • Yarn
  • Zookeeper
  • Maven
  • Git
  • 数据仓库
  • 用户画像
  • 指标体系
数据治理
关于
  • 设计模式概述
  • 创建型模式

    • 单例模式
    • 简单工厂模式
    • 工厂方法模式
    • 抽象工厂模式
    • 建造者模式
    • 原型模式
  • 结构型模式

    • 适配器模式
    • 装饰器模式
    • 代理模式
    • 外观模式
    • 桥接模式
    • 组合模式
    • 享元模式
  • 行为型模式

    • 策略模式
    • 模板方法模式
    • 观察者模式
    • 迭代器模式
      • 一、概述
        • 1.1 解决了什么问题
        • 1.2 解决方案
      • 二、实现方式
        • 2.1 角色
        • 2.2 代码
      • 三、源码中的应用
    • 责任链模式
    • 命令模式
    • 备忘录模式
    • 状态模式
    • 访问者模式
    • 中介者模式
    • 解释器模式
  • 设计模式
  • 行为型模式
Will
2022-03-29
目录

迭代器模式

# 一、概述

迭代器(Iterator)模式提供一种遍历结合元素的统一接口,用一致的方法遍历集合元素,不需要关心集合对象的底层实现。

在 Java 中不需要自己实现迭代器模式,集合类就是迭代器模式的实现。

# 1.1 解决了什么问题

迭代器模式主要用在对集合数据进行遍历的场景下,JDK 就提供了 Iterable 接口,Collection接口继承自Iterable接口,所以Collection的子类对客户端提供了统一的遍历方式。

但是Collection的子类是有很多个的,每个子类内部实现是不一样的,所以各个子类的遍历方式或者说遍历的算法也是不一样的,而且同一个子类在不同的 JDK 版本中的内部实现也可能会有差异,但是无论 JDK 源码如何修改,都应该保持向后兼容,保证暴露给客户端的接口是不变的。

# 1.2 解决方案

迭代器模式的思想就是将集合的遍历行为抽取为单独的迭代器对象,实际上 JDK 源码就是这样干的。

# 二、实现方式

# 2.1 角色

  1. Iterator:迭代器,该接口声明了遍历集合所需的操作,获取下一个元素,获取当前位置等。
  2. Concrete Iterators:具体迭代器,实现遍历集合的各个接口。
  3. Collection:集合,该接口声明一个或多个方法来获取与集合兼容的迭代器。
  4. Concrete Collections:具体集合,会在客户端请求迭代器时返回一个特定的具体迭代器类实体。

# 2.2 代码

定义 Iterator 接口:

public interface MyIterator<E> {
    boolean hasNext();
    E next();
}
1
2
3
4

定义 Collection 接口:

public interface MyCollection<E> {
    MyIterator<E> getIterator();
}
1
2
3

定义 Concrete Collection 和 Concrete Iterator:

public class MyList<E> implements MyCollection<E> {
    private Object[] containor;
    private int totalSize;
    private int currSize;

    public MyList(int size) {
        this.totalSize = size;
        this.containor = new Object[size];
    }

    public void add(E e) throws Exception {
        if (this.currSize == this.totalSize) {
            throw new Exception("容器已满");
        }

        containor[this.currSize] = e;
        currSize++;
    }

    @Override
    public MyIterator<E> getIterator() {
        return new MyListIterator<E>();
    }

    private class MyListIterator<E> implements MyIterator<E> {

        int index;

        @Override
        public boolean hasNext() {
            if (this.index < currSize) {
                return true;
            }
            return false;
        }

        @Override
        public E next() {
            if (this.hasNext()) {
                return (E) containor[index++];
            }
            return null;
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45

示例:

public class IteratorTest {
    public static void main(String[] args) throws Exception {
        MyList<String> myList = new MyList(10);
        myList.add("1");
        myList.add("2");
        myList.add("3");
        myList.add("4");
        myList.add("5");
        myList.add("6");

        MyIterator<String> iterator = myList.getIterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
1
2
3
4
5
6
1
2
3
4
5
6

# 三、源码中的应用

java.util.Iterator

上次更新: 2023/11/01, 03:11:44

← 观察者模式 责任链模式→

Theme by Vdoing | Copyright © 2022-2023 Will 蜀ICP备2022002285号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式