一、概念
迭代器模式(Iterator Pattern):迭代器模式将集合对象的遍历操作从集合类中拆分出来,放到迭代器类中,让两者的职责更加单一。
通俗的讲:迭代器模式就是提供一种遍历的方法,这种方法有两个特点:一是按你想要的方式访问到你想访问的元素,二是不暴露底层是什么存的。
大部分编程语言都提供了遍历容器的迭代器类,我们在平时开发中,直接拿来用即可,几乎不大可能从零编写一个迭代器。
二、实现
这里实现一个简单字符串迭代器:
1、迭代器接口
public interface Iterator<E> {
boolean hasNext();
void next();
E getCurrentItem();
}
2、实现迭代器
public class ArrayIterator<E> implements Iterator<E> {
private int index;
private ArrayList<E> arrayList;
public ArrayIterator(ArrayList<E> list) {
this.arrayList = list;
}
@Override
public boolean hasNext() {
return index != arrayList.size();
}
@Override
public void next() {
index++;
}
@Override
public E getCurrentItem() {
return arrayList.get(index);
}
}
3、测试类
public class Client {
public static void main(String[] args) {
ArrayList<String> nameList = new ArrayList<>();
nameList.add("Jay");
nameList.add("Jason");
nameList.add("Daniel");
ArrayIterator iterator = new ArrayIterator(nameList);
while (iterator.hasNext()) {
String name = (String) iterator.getCurrentItem();
System.out.println(name);
iterator.next();
}
}
}
4、运行结果
总结:对于类似数组和链表这样的数据结构,遍历方式比较简单,在原来的类中实现也可以。但是,对于复杂的数据结构(比如树、图)来说,有各种复杂的遍历方式。比如,树有前中后序、按层遍历,图有深度优先、广度优先遍历等等。如果将这部分遍历的逻辑写到容器类中,也会导致容器类代码的复杂性,所以统一将遍历操作拆分到迭代器类中。