一.小结
- 定义:提供一种方法访问一个容器对象中的各个元素,而又不暴露该对象的内部细节。
- 优点:1.它支持以不同的方式遍历一个聚合对象 2.迭代器简化了聚合类 3.在同一个聚合上可以有多个遍历 4.新增聚合类和迭代器类都很方便
- 缺点:由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要增加相应的迭代器类,在一定程度上增加了系统的复杂性
- 使用场景:JDK中很多集合类都实现Iterable,是迭代器模式的体现;现实中,基本很少写一个迭代器。
- 通用UML图
二.例子
下面通过迭代器模式来模拟java中list
-
迭代器接口
public interface Iterator { // 下一个元素 int next(); // 删除当前元素 int remove(); // 是否存在下个元素 boolean hasNext(); }
-
迭代器接实现类
public class ListIterator implements Iterator { // 存放数据 private Vector<Integer> vector; // 当前元素索引 private int current = 0; public ListIterator(Vector<Integer> vector) { this.vector = vector; } @Override public int next() { return vector.get(current++); } @Override public int remove() { return vector.remove(current); } @Override public boolean hasNext() { if (current >= vector.size()) { return false; } else { return true; } } }
-
容器接口
public interface IList { void add(int item); void remove(int item); Iterator iterator(); }
-
具体的容器
public class List implements IList { private Vector<Integer> vector = new Vector<>(); @Override public void add(int item) { vector.add(item); } @Override public void remove(int item) { vector.remove(item); } @Override public Iterator iterator() { return new ListIterator(vector); } }
-
情景类
public class Client { public static void main(String[] args) { IList list = new List(); list.add(1); list.add(2); list.add(3); Iterator iterator = list.iterator(); while (iterator.hasNext()) { System.out.print(iterator.next() + "--"); } } }