迭代器模式是一种遍历集合的常见设计模式。该方式提供一种顺序访问集合对象的方法,无需知道集合内部具体表示。这种设计模式是将集合与迭代器分开,简化了集合类,遍历集合对象,只需要在迭代器上进行操作。
迭代器模式支持多种遍历模式,增加新的集合类与迭代器都很方便,无需修改原有代码。但是缺点是,需要同时增加集合类与迭代器两个类,这在一定程度上增加了系统的复杂性,因为集合与迭代器的职责是分开的。
迭代器模式,就是将集合的遍历行为分开,抽象出一个迭代器来负责遍历,这样不仅可以不用暴露集合内部结构表示,还可以提供一个透明的方式访问集合内部数据。
这里通过代码实现迭代器模式的例子,先给出接口类关系图:
集合接口:Collection.java
package com.xxx.design.iterator;
public interface Collection {
public Iterator iterator();
public Object get(int index);
public int size();
}
迭代器接口:Iterator.java
package com.xxx.design.iterator;
public interface Iterator {
public Object prev();
public Object next();
public boolean hasNext();
public Object first();
}
列表集合实现类:List.java
package com.xxx.design.iterator;
public class List implements Collection{
public String [] data = {"A","B","C","D","E"};
@Override
public Iterator iterator() {
// TODO Auto-generated method stub
return new ListIterator(this);
}
@Override
public Object get(int index) {
// TODO Auto-generated method stub
return data[index];
}
@Override
public int size() {
// TODO Auto-generated method stub
return data.length;
}
}
列表迭代器实现类:ListIterator.java
package com.xxx.design.iterator;
public class ListIterator implements Iterator {
private Collection collection;
private int pos = -1;
public ListIterator(Collection collection) {
// TODO Auto-generated constructor stub
this.collection = collection;
}
@Override
public Object prev() {
// TODO Auto-generated method stub
if(pos>0){
pos--;
}
return collection.get(pos);
}
@Override
public Object next() {
// TODO Auto-generated method stub
if(pos<collection.size()-1){
pos++;
}
return collection.get(pos);
}
@Override
public boolean hasNext() {
// TODO Auto-generated method stub
if(pos<collection.size()-1){
return true;
}
return false;
}
@Override
public Object first() {
// TODO Auto-generated method stub
pos = 0;
return collection.get(pos);
}
}
迭代器测试类 :IteratorMain.java
package com.xxx.design.iterator;
public class IteratorMain {
public static void main(String[] args) {
// TODO Auto-generated method stub
Collection collection = new List();
Iterator iterator = collection.iterator();
while(iterator.hasNext()){
System.out.print(iterator.next()+" ");
}
System.out.println();
}
}
运行该测试类,控制台打印信息如下:
A B C D E
根据前面的介绍,我们如果需要增加一个集合类的实现,就需要增加一个集合类对应的迭代器,类是成对增加的,如同List和ListIterator一样,如果集合类越来越多,系统复杂度也越来越大。