介绍
迭代器设计模式: 迭代器提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。
适用性
- 达到了数据结构与操作的分离
- 访问一个集合对象而无需暴露它的内部表示
- 支持对集合对象的多种遍历
- 为遍历不同的集合结构提供一个统一的接口
UML结构图:
场景模拟
集合遍历操作
代码实现
1.定义迭代接口,即Iterator:
public interface Iterator<T> {
public T first();
public T next();
public T current();
public boolean hasNext();
}
2.实现迭代接口:
public class ConcreteIterator<T> implements Iterator {
private List<T> list;
private int cursor = 0;
@Override
public T first() {
return list.get(0);
}
public ConcreteIterator(final List<T> list) {
if (list == null) {
throw new NullPointerException("list can not be null!");
}
this.list = list;
}
@Override
public T next() {
return hasNext() ? list.get(cursor++) : null;
}
@Override
public T current() {
return list.get(cursor);
}
@Override
public boolean hasNext() {
return cursor < list.size();
}
}
3.模拟集合接口Aggregate:
public interface Aggregate<T> {
public void add(T t);
public void remove(int index);
public Iterator<T> iterator();
}
4.模拟集合接口实现,ConcreteAggregate:
public class ConcreteAggregate implements Aggregate<String> {
private List<String> list;
public ConcreteAggregate() {
list = new ArrayList<String>();
}
@Override
public void add(String s) {
list.add(s);
}
@Override
public void remove(int index) {
list.remove(index);
}
@Override
public Iterator<String> iterator() {
return new ConcreteIterator<String>(list);
}
}
5.调用,即Client:
public class Run {
public static void main(String[] args) {
ConcreteAggregate aggregate = new ConcreteAggregate();
aggregate.add("a");
aggregate.add("b");
aggregate.add("c");
Iterator<String> iterator = aggregate.iterator();
System.out.println(iterator.first());
System.out.println();
while (iterator.hasNext()) {
System.out.println(iterator.current());
System.out.println(iterator.next());
}
}
}