Iterator设计模式
客户端希望遍历被放入容器/集合类的一组ADT对象,无需关心容器的具体类型
也就是说,不管对象被放进哪里,都应该提供同样的遍历方式
类结构
- 可迭代接口
- 具体类
- 迭代器接口
- 具体迭代器
其中可迭代接口,迭代器接口,java中已经实现,我们直接使用即可
可迭代接口:Iterable<E>
,需要实现方法Iterator<E> iterator()
迭代器接口:Iterator<E>
,通常需要实现2个方法
boolean hasNext()
E next()
还有两个default方法,选择实现void remove()
void forEachRemaining(Consumer<? super E> action)
具体类实现Iterable接口
// Aggregate.java
public class Aggregate implements Iterable<Any> {
@Override
public Iterator<Any> iterator() {
// 据情况选择把什么传给iterator,这里比较粗暴
return new AggregateIterator(this);
}
}
具体迭代器
// AggregateIterator.java
public class AggregateIterator implements Iterator<Any> {
// some fields
// ...
public AggregateIterator(Aggregate aggregate) {...}
@Override
public boolean hasNext() {...}
@Override
public Any next() {...}
}
当然,还有一种方式,具体迭代器作为具体类的私有内部类,不用考虑向iterator传值
be like
public class Aggregate implements Iterable<Any> {
// ...
private class AggregateIterator implements Iterator<Any> {...}
}
客户端
// 很简单了
Aggregate aggregate = new Aggregate();
Iterator<Any> iterator = aggregate.iterator();
while (iterator.hashNext()) {
Any any = iterator.next();
// do something with any
}