1. 意图(Intent)

提供一种顺序访问聚合对象元素的方法,并且不暴露聚合对象的内部表示。

2. 类图(Class Diagram)

image-20201102012333804.png

  • Aggregate :是聚合类,其中 createIterator() 方法可以产生一个 Iterator;
  • Iterator :主要定义了 hasNext() 和 next() 方法;
  • Client :组合了 Aggregate,为了迭代遍历 Aggregate,也需要组合 Iterator。

    3. 实现(Implementation)

具体的迭代器实现类(ConcreteIterator)中有一个指针或者说引用类型,指向了具体容器实现类(ConcreteAggregate),因此通过指针或引用操作即可 。

聚合类接口 [ Aggregate ]

  1. public interface Aggregate {
  2. Iterator createIterator();
  3. }

某个具体的实现聚合类 [ ConcreteAggregate ]

  1. public class ConcreteAggregate implements Aggregate {
  2. private Integer[] items; // 内部结构是一个数组
  3. public ConcreteAggregate() {
  4. items = new Integer[10];
  5. for (int i = 0; i < items.length; i++) {
  6. items[i] = i;
  7. }
  8. }
  9. @Override
  10. public Iterator createIterator() {
  11. return new ConcreteIterator<Integer>(items);
  12. }
  13. }

抽象的迭代器接口 [ Iterator ]

  1. public interface Iterator<Item> {
  2. Item next(); // 返回下一个迭代器
  3. boolean hasNext(); // 是否有下一个迭代器
  4. }

具体的迭代器实现类 [ ConcreteIterator ]

  1. public class ConcreteIterator<Item> implements Iterator {
  2. private Item[] items;
  3. private int position = 0;
  4. public ConcreteIterator(Item[] items) {
  5. this.items = items;
  6. }
  7. @Override
  8. public Object next() {
  9. return items[position++];
  10. }
  11. @Override
  12. public boolean hasNext() {
  13. return position < items.length;
  14. }
  15. }

客户端演示:

  1. public class Client {
  2. public static void main(String[] args) {
  3. Aggregate aggregate = new ConcreteAggregate();
  4. Iterator<Integer> iterator = aggregate.createIterator();
  5. while (iterator.hasNext()) {
  6. System.out.println(iterator.next());
  7. }
  8. }
  9. }

4. JDK