设计模式之迭代器模式

迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。

迭代器模式(Iterator)实际上在Java的集合类中已经广泛使用了。我们以List为例,要遍历ArrayList,即使我们知道它的内部存储了一个Object[]数组,也不应该直接使用数组索引去遍历,因为这样需要了解集合内部的存储结构。如果使用Iterator遍历,那么,ArrayList和LinkedList都可以以一种统一的接口来遍历:

for(Iterator<String> it = list.iterator();it.hasNext()){
    String s = it.next();
}

不需要知道其内部结构,只调用其迭代器获取对象

Java允许我们直接把任何支持Iterator的集合对象用foreach循环写出来:

List<String> list = ...
for (String s : list) {

}

然后由Java编译器完成Iterator模式的所有循环代码。

如何实现一个Iterator

AbstractList中有内部类Itr implements Iterator

Collection接口继承了Iterable接口

public class ReverseArrayCollection<T> implements Iterable<T> {

    private T[] array;

    public ReverseArrayCollection(T... array) {
        this.array = array;
    }

    // 返回一个 iterator 对象
    @Override
    public Iterator<T> iterator() {
        return new ReverseArrayIterator();
    }

    class ReverseArrayIterator implements Iterator<T> {
        int index;

        public ReverseArrayIterator() {
            // 由于倒序 index 在数组的末尾
            this.index = ReverseArrayCollection.this.array.length;
        }

        @Override
        public boolean hasNext() {
            // 如果index大于零则代表可以向前遍历
            return index > 0;
        }

        @Override
        public T next() {
            return array[--index];
        }
    }
}
posted @ 2021-03-13 18:45  胖大星-  阅读(65)  评论(0编辑  收藏  举报