迭代器(Iterator)

Intent

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

Class Diagram

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

设计模式 - 迭代器 - 图1

Implementation

  1. public interface Aggregate {
  2. Iterator createIterator();
  3. }
  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. }
  1. public interface Iterator<Item> {
  2. Item next();
  3. boolean hasNext();
  4. }
  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. }

JDK

设计模式 - 迭代器 - 图2