Fork me on GitHub

容器中的游标-迭代器模式

迭代器模式又称为游标模式,Java中的List遍历就可以使用迭代器,而不需要使用“明显”的遍历算法,下面举一个迭代器模式的小例子

迭代器接口

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

具体迭代器类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class ConcreteIterator<T> implements Iterator {

private List<T> list = new ArrayList<T>();
private int cursor = 0;
public ConcreteIterator(List<T> list) {
this.list = list;
}

@Override
public boolean hasNext() {
return cursor != list.size();
}

@Override
public Object next() {
T obj = null;
if (this.hasNext()) {
obj = this.list.get(cursor++);
}
return obj;
}
}

容器接口

1
2
3
4
5
public interface Aggregate<T> {
void add(T obj);
void remove(T obj);
Iterator<T> iterator();
}

具体容器类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class ConcreteAggregate<T> implements Aggregate<T> {
private List<T> list = new ArrayList<T>();
@Override
public void add(T obj) {
list.add(obj);
}

@Override
public void remove(T obj) {
list.remove(obj);
}

@Override
public Iterator<T> iterator() {
return new ConcreteIterator<T>(list);
}
}

实现示例

1
2
3
4
5
6
7
8
9
10
11
12
public class Main {
public static void main(String[] args) {
Aggregate<String> aggregate = new ConcreteAggregate<>();
aggregate.add("android");
aggregate.add("studio");
aggregate.add("Google");
Iterator<String> iterator = aggregate.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
}
}

实际上,迭代器模式是一个不需要由开发者实现的模式,这里只是来解析以下迭代器是怎样构成的,实际上List容器有自带的迭代器,不需要我们自己实现