CS-Notes全部笔记在阅读器中打开

迭代器(Iterator)

意图

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

类图

类图的配图

实现

public interface Aggregate<Item> {
    Iterator<Item> createIterator();
}
public class ConcreteAggregate implements Aggregate<Integer> {

    private Integer[] items;

    public ConcreteAggregate() {
        items = new Integer[10];
        for (int i = 0; i < items.length; i++) {
            items[i] = i;
        }
    }

    @Override
    public Iterator<Integer> createIterator() {
        return new ConcreteIterator<>(items);
    }
}
public interface Iterator<Item> {

    Item next();

    boolean hasNext();
}
public class ConcreteIterator<Item> implements Iterator<Item> {

    private Item[] items;
    private int position = 0;

    public ConcreteIterator(Item[] items) {
        this.items = items;
    }

    @Override
    public Item next() {
        return items[position++];
    }

    @Override
    public boolean hasNext() {
        return position < items.length;
    }
}
public class Client {

    public static void main(String[] args) {
        Aggregate<Integer> aggregate = new ConcreteAggregate();
        Iterator<Integer> iterator = aggregate.createIterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
    }
}
0
1
...
9

Client 只用到 hasNext() 和 next(),ConcreteAggregate 把数组换成链表时,只要同时换掉迭代器,Client 不用改。

JDK 中的应用

参考资料

在阅读器中可以用目录和搜索、切换深色模式、练习这篇笔记中的面试题:打开《设计模式 - 迭代器》