设计模式之迭代器模式

此模式看下图就知道了,用来遍历访问ArrayList中数据对象,而不会暴露内部逻辑。
在这里插入图片描述

在ArrayList中有一个迭代器,Itr,用来访问ArrayList中的数据。

一般调用方式如下,

List<String> list = new ArrayList<>();
Iterator<String> iterator = list.iterator();
while(iterator.hasNext()){
    System.out.println(iterator.next());
}

把ArrayList源码提取出来,去掉和上面迭代无关的代码,变成如下样子,

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

	private int size; //下面数组的长度
	transient Object[] elementData;

	public Iterator<E> iterator() {
        return new Itr();
    }

    
    private class Itr implements Iterator<E> {
        int cursor;  

        public boolean hasNext() {
            return cursor != size; //当前游标没有到最大长度,表示还有下一个
        }

        public E next() {
            int i = cursor;
            Object[] elementData = ArrayList.this.elementData;
            cursor = i + 1; //获取完数据后,游标下移一位
            return (E) elementData[i];
        }
    }
}

从上面调用list.iterator()其实是获取了一个内部类,这个内部类用来通过next()遍历数组,而我们不用关心next()中是怎么实现的,只需要调用即可。

再看iterator()这个方法,是不是很像工厂方法,而ArrayList就是这个工厂,用来生产迭代器对象。

posted @ 2022-04-05 07:08  伟衙内  阅读(11)  评论(0编辑  收藏  举报