• 定义迭代器的接口,以及对应的hasNext以及next方法
    • 注意定义的时候使用泛型,不然接口方法的返回值只能是Object,实际使用的时候还需要强制转换
  • 在被迭代的接口里面定义获取迭代器的方法
    • 注意使用泛型
  • 在需要被迭代的对象里面实现一个具体迭代器,专属于这个对象的迭代器以及对应的迭代方法,每一个对象的迭代遍历的方法应该是不一样
    • 注意实现被迭代接口的时候标注的泛型依旧是被迭代对象
    • public class MyArrayList<E> implements MyCollection<E>

实现(注意适应泛型)

定义迭代器的抽象方法

1
2
3
4
5
6
7
8
9
10
11
package com.deltaqin.designPattern.d06_iterator;

/**
* @author deltaqin
* @date 2021/3/27 10:38 上午
*/
public interface MyIterator<T> {
boolean hasNext();

T next();
}

定义集合的抽象方法

1
2
3
4
5
6
7
8
9
10
11
12
package com.deltaqin.designPattern.d06_iterator;

/**
* @author deltaqin
* @date 2021/3/27 10:39 上午
*/
public interface MyCollection<E> {
void add(E e);
int size();

MyIterator myiterator();
}

在集合内部实现迭代器的具体逻辑

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
package com.deltaqin.designPattern.d06_iterator;

/**
* @author deltaqin
* @date 2021/3/27 10:40 上午
*/
public class MyArrayList<E> implements MyCollection<E>{
private E[] objects = (E[])new Object[10];
private int size = 0;

public void add(E e) {
if (size+1 < objects.length) {
E[] objectTmp = (E[])new Object[objects.length * 2];
System.arraycopy(objects,0,objectTmp,0,objects.length);
objects = objectTmp;
}

objects[size++] = e;
}

@Override
public int size() {
return size;
}

@Override
public MyIterator myiterator() {
return new ArrayListIterator<E>();
}

class ArrayListIterator<E> implements MyIterator<E> {

private int index = 0;

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

@Override
public E next() {
E e = (E) objects[index++];
return e;
}
}
}

测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package com.deltaqin.designPattern.d06_iterator;

/**
* @author deltaqin
* @date 2021/3/27 10:33 上午
*/
public class Demo {
public static void main(String[] args) {
MyCollection<String> myCollection = new MyArrayList<>();

myCollection.add("delta0");
myCollection.add("delta1");
myCollection.add("delta2");
myCollection.add("delta3");

MyIterator myiterator = myCollection.myiterator();
while (myiterator.hasNext()) {
System.out.println(myiterator.next());
}
}
}