- JDK的ArrayList 集合中就使用了迭代器模式
public class IteratorPattern {
@SuppressWarnings("rawtypes")
public static void main(String[] args) {
// TODO Auto-generated method stub
List<String> a = new ArrayList<>();
a.add("jack");//..
Iterator Itr = a.iterator();
while (Itr.hasNext()) {
System.out.println(Itr.next());
}
}
}
public interface Iterator<E> {
boolean hasNext();
E next();
default void remove() {
throw new UnsupportedOperationException("remove");
}
}
//ArrayList 聚合实现类,实现了聚合接口List
public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable{
private class Itr implements Iterator<E> { //内部类Itr 实现了Iterator 接口,是具体的接口实现类。
//省略
public boolean hasNext() {
return cursor != size;
}
@SuppressWarnings("unchecked")
public E next() {}//省略 }
public Iterator<E> iterator() {
return new Itr();
} // 聚合实现类,得到一个迭代器}
public interface List<E> extends Collection<E> {
Iterator<E> iterator(); //聚合接口,返回迭代器
}
内部类Itr 充当具体实现迭代器Iterator 的类, 作为ArrayList 内部类
List 就是充当了聚合接口,含有一个iterator() 方法,返回一个迭代器对象
ArrayList 是实现聚合接口List 的子类,实现了iterator()
Iterator 接口系统提供
迭代器模式解决了 不同集合(ArrayList ,LinkedList) 统一遍历问题
优点
1) 提供一个统一的方法遍历对象,客户不用再考虑聚合的类型,使用一种方法就可以遍历对象了。
2) 隐藏了聚合的内部结构,客户端要遍历聚合的时候只能取到迭代器,而不会知道聚合的具体组成。
3) 提供了一种设计思想,就是一个类应该只有一个引起变化的原因(叫做单一责任原则)。在聚合类中,我们把迭代器分开,就是要把管理对象集合和遍历对象集合的责任分开
这样一来集合改变的话,只影响到聚合对象。而如果遍历方式改变的话,只影响到了迭代器。
4) 当要展示一组相似对象,或者遍历一组相同对象时使用, 适合使用迭代器模式
缺点
每个聚合对象都要一个迭代器,会生成多个迭代器不好管理类