Skip to the content.

设计模式(1)Iterator模式

编辑文章  


Iterator是java集合框架的成员,使用了设计模式中的Iterator模式

 我们从API中将这种方式提炼出来,并且了解List的设计

 Iterator核心设计

1 定义接口

2 然后写一个类实现Iterator,即迭代器, 这个类可以是单独的一个类。在ArryayList的设计里,Itr是设计在ArrayList的内部类

    private class Itr implements Iterator<E> {
        int cursor;       // index of next element to return
        int lastRet = -1; // index of last element returned; -1 if no such
        int expectedModCount = modCount;

        public boolean hasNext() {
            return cursor != size;
        }

        public E next() {
            checkForComodification();
            int i = cursor;
            if (i >= size)
                throw new NoSuchElementException();
            Object[] elementData = ArrayList.this.elementData;
            if (i >= elementData.length)
                throw new ConcurrentModificationException();
            cursor = i + 1;
            return (E) elementData[lastRet = i];
        }
    }

3 ArrayList 实现Iterable

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

 思考

Q:使用 Iterator 这样写有什么好处呢?
A:引入Iterator后可以将遍历与实现分离开

    List<Integer> list = new ArrayList<>();
    list.addAll(Arrays.asList(1, 2, 3, 4, 5));
    Iterator<Integer> it = list.iterator();
	while(it.hasNext()){
		System.out.println(it.next());
	}

显然while循环并不依赖于ArraysList的实现。当API编写人员不用数组来实现ArrayList而是用其他的方式,只要能返回正确的Iterator实例,hasNext方法和next方法可以正常工作。不对上面方法做任何修改,代码都可以正常工作。对于ArrayList的调用者来说非常方便。 设计模式的作用就是帮助我们编写可复用的类。所谓“可复用”就是指将类实现为“组件”,当一个组件发生改变时,不需要对其他的组件进行修改或者只需要很小的修改即可对应。 这要也就理解为什么示例程序中iterator()的返回值不是、Itr而是Iterator了。

实际上新的API版本中 Iterator还有一些小细节