Iterator迭代器模式

来源:互联网 发布:win10下装mac双系统 编辑:程序博客网 时间:2024/06/07 05:25

ArryList和LinkedList遍历的方式肯定是不一样的,如果用for循环中遍历,那么每一种不同的容器实现遍历肯定不一样,要统一所有的容器的遍历(调用一样,但容器底层不一样),那么让每一种容器都实现Iterator接口,用此接口对容器进行遍历。

之所以把Iterator单独写成一个组件,聚合在Collection或Map内部,而不把元素遍历直接写在Collection或Map接口里,原因如下:
1、接口应当设计得越细越好,组件分开
2、当用户使用一个组件时,该组件要实现什么功能就是用什么接口,而不需要关心其他接口的实现。
说白了,就是把遍历功能单独封装成一个对象

Iterator迭代器接口,用于统一不同容器的迭代方式

package test;public interface Iterator {    public boolean hasNext();     public Object next();}

Collection顶级容器中返回一个Iterator对象,用于对容器进行迭代

package test;public interface Collection {    public void add(Object o);    public int size();    //返回迭代器对象    public Iterator iterator();}

ArrayList中用内部类来写具体的迭代方法

package test;//手动写一个容器类,用数组模拟public class ArrayList implements Collection {    // 数组大小为10,当数组中装满时,扩展空间,这样就可以实现无限多个    Object[] objects = new Object[10];    // index记录装了多少个对象    int index;    // 添加对象    public void add(Object o) {        if (index == objects.length) {            // 当现有数组满了就创建一个新的数组对象,这个数组对象创建为多大,java内部会有一个加权算法            Object[] newObjects = new Object[objects.length * 2];            // 把原数组内容copy到新数组中            System.arraycopy(objects, 0, newObjects, 0, objects.length);            // 元素组引用指向新数组            objects = newObjects;        }        objects[index] = o;        index++;    }    // 容器已装元素的个数    public int size() {        return index;    }    // 迭代器    @Override    public Iterator iterator() {        // TODO Auto-generated method stub        return new ArrayListIterator();    }    // 用内部类来写不同容器的迭代方式    private class ArrayListIterator implements Iterator {        //记录当前访问到哪一个index了。        private int currentindex=0;        @Override        public boolean hasNext() {            if (currentindex>=index)                return false;            else                return true;        }        @Override        public Object next() {            Object o=objects[currentindex++];            currentindex++;            return o;                   }    }}
0 0