概述
迭代器模式它可以让用户通过一个迭代器的接口去迭代访问容器中的每一个元素而不用去关心容器内部数据的具体数据结构及实现。
优点:符合面向对象原则,将迭代的功能交给单一的迭代器去完成,同时使得容器可以拥有不同的迭代方式。
缺点:增加了系统的复杂性。
实现
迭代器模式的类图
通过一个抽象的迭代器接口去定义了迭代器的行为,同时抽象容器对象也为容器提供返回迭代器接口的方法。
简单实现
这里模仿ArrayList去简单的实现一个MyArrayList。自定义Iterator接口和抽象容器(直接使用Collection的话里面定义的内容比较多比较繁杂)
Iterator接口:
public interface Iterator <E> {
boolean hasNext();
Object next();
}
first方法就暂时不定义了。主要实现迭代的功能
抽象容器:
public abstract class MyCollection <E> {
abstract int size();
abstract Iterator<E> iterator();
abstract E get(int index);
abstract void add(E e);
}
定义了基本的方法。
实现:
public class MyArrayList<E> extends MyCollection<E> {
private Object[] data;
private int size;
public MyArrayList(int cap){
this.data = new Object[cap];
}
@Override
public int size() {
return size;
}
@Override
public Iterator<E> iterator() {
return new MyIterator();
}
@SuppressWarnings("unchecked")
@Override
public E get(int index) {
if (index < 0 || index > size())
throw new IllegalArgumentException();
return (E) data[index];
}
@Override
public void add(Object e) {
if (size == data.length)
resize();
data[size] = e;
++size;
}
private void resize() {
Object[] newData = new Object[data.length << 1];
System.arraycopy(data, 0, newData, 0, data.length);
data = newData;
}
private class MyIterator implements Iterator<E> {
private int cursor;
@Override
public boolean hasNext() {
return cursor != size;
}
@Override
public Object next() {
if (cursor >= size)
return new NoSuchElementException();
return data[cursor++];
}
}
}
定义了一个私有的内部类去实现了Iterator'接口并通过iterator方法返回该接口的实例。
使用:
public class Test {
public static void main(String[] args) {
MyArrayList<Integer> list = new MyArrayList<>(10);
for (int i = 0; i < 10; i ++)
list.add(i);
for (Iterator<Integer> it = list.iterator(); it.hasNext();)
System.out.println(it.next());
}
}
输出:
0
1
2
3
4
5
6
7
8
9