设计模式——迭代器模式

概述

首先简述2个概念

  1. UML 中的 类图 (Class Diagram) 用于表示类、接口、实例等之间的静态关系
  2. 只要在一个类中持有另外一个类的实例, 无论是一个还是多个, 它们之间就是聚合关系

迭代器模式提供一种方法顺序访问一个聚合对象中各个元素, 而又无须暴露该对象的内部表示。

下边通过模拟List来说明Java中的迭代器, 详细实现请阅读jdk源码。

实现

我们将创建一个叙述导航方法的 Iterator 接口和一个返回迭代器的 List 接口, 实现了 Container 接口的实体类将负责实现 Iterator 接口, 类图如下

Iterator接口

1
2
3
4
5
6
7
8
9
10
11
/**
* @author 当我遇上你
* @公众号 当我遇上你
* @since 2020-10-04
*/
public interface Iterator<E> {

boolean hasNext();

E next();
}

List接口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/**
* @author 当我遇上你
* @公众号 当我遇上你
* @since 2020-10-04
*/
public interface List<E> {

/**
* 生成遍历集合的迭代器
* @return
*/
Iterator<E> iterator();

}

ArrayList实现类

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
46
47
48
49
50
51
52
53
54
55
56
/**
* @author 当我遇上你
* @公众号 当我遇上你
* @since 2020-10-04
*
* 阉割版, 仅用于演示设计模式
*/
public class ArrayList<E> implements List<E> {

transient Object[] elementData;
private int size;

public ArrayList(int initialCapacity) {
if (initialCapacity > 0) {
this.elementData = new Object[initialCapacity];
}
}

public boolean add(E e) {
elementData[size++] = e;
return true;
}

@Override
public Iterator iterator() {
return new Itr();
}


/**
* 迭代器实现
*/
private class Itr implements Iterator<E> {

Itr() {}

/**
* 下个返回元素游标
*/
int cursor;

@Override
public boolean hasNext() {
return cursor < size;
}

@Override
public E next() {
if (this.hasNext()) {
return (E) elementData[cursor++];
}

return null;
}
}
}

演示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/**
* @author 当我遇上你
* @公众号 当我遇上你
* @since 2020-10-04
*/
public class IteratorDemo {

public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>(16);
list.add("张三");
list.add("李四");
list.add("王五");

Iterator iterator = list.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}

}
}

执行程序, 输出结果

1
2
3
张三
李四
王五

最后

本文到此结束,感谢阅读。如果您觉得不错,请关注公众号【当我遇上你】,您的支持是我写作的最大动力。