迭代器模式

迭代器用于遍历集合对象

迭代器模式(Iterator Design Pattern)将集合对象的遍历操作从集合类中拆分出来,放到迭代器类中,让两者的职责更加单一。
一个完整的迭代器模式一般会涉及容器容器迭代器两部分内容。

迭代器模式的结构

Iterator 接口


// 接口定义方式一
public interface Iterator<E> {
  boolean hasNext();
  void next();
  E currentItem();
}

// 接口定义方式二
public interface Iterator<E> {
  boolean hasNext();
  E next();
}

第一种定义方式更加灵活一些,比如我们可以多次调用 currentItem() 查询当前元素,而不移动游标。


public class ArrayIterator<E> implements Iterator<E> {
  private int cursor;
  private ArrayList<E> arrayList;

  public ArrayIterator(ArrayList<E> arrayList) {
    this.cursor = 0;
    this.arrayList = arrayList;
  }

  @Override
  public boolean hasNext() {
    return cursor != arrayList.size(); //注意这里,cursor在指向最后一个元素的时候,hasNext()仍旧返回true。
  }

  @Override
  public void next() {
    cursor++;
  }

  @Override
  public E currentItem() {
    if (cursor >= arrayList.size()) {
      throw new NoSuchElementException();
    }
    return arrayList.get(cursor);
  }
}


public interface List<E> {
  Iterator iterator();
}

public class ArrayList<E> implements List<E> {

  private int cursor;
  private ArrayList<E> arrayList;

  public Iterator iterator() {
    return new ArrayIterator(this);
  }
}

public class Demo {
  public static void main(String[] args) {
    List<String> names = new ArrayList<>();
    names.add("xzg");
    names.add("wang");
    names.add("zheng");
    
    Iterator<String> iterator = names.iterator();
    while (iterator.hasNext()) {
      System.out.println(iterator.currentItem());
      iterator.next();
    }
  }
}

迭代器设计模式

for循环与迭代器循环各有优势