介绍
迭代器模式非常的常用,以至于我们的JDK直接将迭代器封装到JDK中,比如Iterator类。所以在开发中,我们很少自己写迭代器,而是用JDk封装好的迭代器,下面我们就简单模拟一下迭代器。
UML
- MyList:相当于我们平时用的List接口,但这里为了方便理解,只写了和迭代器相关的。
- MyArrayList:相当于我们平时用的ArrayList
- Iterator:这个是迭代器的接口
- MyItr:这里是真实的迭代器
代码
- 先看集合吧!
public abstract class MyList {
public abstract Iterator createIterator();
}
public class MyArrayList<T> extends MyList {
public T[] data = null;
public MyArrayList(T[] data){
this.data = data;
}
@Override
public Iterator createIterator() {
return new MyItr(this);
}
}
- 迭代器,我这里模拟的从头开始遍历,实际开发中,你也可以从尾部遍历
public abstract class Iterator <T>{
public abstract T first();
public abstract T next();
public abstract boolean IsDone();
public abstract T currentItem();
}
/**
* 模拟的先序遍历
* @param <T>
*/
public class MyItr<T> extends Iterator {
private MyArrayList<T> myArrayList;
private int index = 0;
public MyItr(MyArrayList<T> myArrayList) {
this.myArrayList = myArrayList;
}
@Override
public T first() {
return myArrayList.data[0];
}
@Override
public T next() {
if(index + 1 < myArrayList.data.length){
return myArrayList.data[++index];
}
return null;
}
@Override
public boolean IsDone() {
return index == myArrayList.data.length - 1;
}
@Override
public T currentItem() {
return myArrayList.data[index];
}
}
- 调用方法
public class Demo {
public static void main(String[] args) {
String[] names = new String[5];
names[0] = "刘备";
names[1] = "关羽";
names[2] = "张飞";
names[3] = "赵云";
names[4] = "姜维";
Iterator<String> iterator = new MyArrayList<String>(names).createIterator();
String name = iterator.first();
System.out.println(name);
while (!iterator.IsDone()){
System.out.println(iterator.next());
}
}
}
总结
在实际开发中,如果你迭代的是树状结构,也可以后序遍历、中序遍历等方式。那么需要增加Iterator的子类,并在MyArrayList的createIterator()方法中,返回新的子类了。