迭代器模式
迭代器(Iterator)模式,又叫做游标(Cursor)模式。GOF给出的定义为:提供一种方法访问一个容器(container)对象中各个元素,而又不需暴露该对象的内部细节。
适用性
1.访问一个聚合对象的内容而无需暴露它的内部表示
2.支持对聚合对象的多种遍历
3.为遍历不同的聚合结构提供一个统一的接口(支持多态迭代)
参与者
1.Iterator
迭代器定义访问和遍历元素的接口
2.ConcreteIterator
实现迭代器接口。对该聚合遍历时跟踪当前位置
3.Aggregate
聚合定义创建相应迭代器对象的接口
4.ConcreteAggregate
实现创建相应迭代器的接口,该操作返回ConcreteIterator的一个适当实例
类图
一个例子:
1.Iterator
public interface Iterator{
Object next();
void first();
void last();
boolean hasNext();
}
2.ConcreteIterator
public class IteratorImpl implements Iterator{
private List list;
private int index;
public IteratorImpl(List list){
index = 0;
this.list = list;
}
public void first(){
index = 0;
}
public void last(){
index = list.getSize();
}
public Object next(){
Object obj = list.get(index);
index++;
return obj;
}
public boolean hasNext(){
return index<list.getSize();
}
}
3.Aggregate
public interface List{
Iterator iterator();
Object get(int index);
int getSize();
void add(Object obj);
}
4.ConcreteAggregate
public class ListImpl implements List{
private Object[] list;
private int index;
private int size;
public ListImpl(){
index = 0;
size = 0;
list = new Object[100];
}
public Iterator iterator(){
return new IteratorImpl(this);
}
public Object get(int index){
return list[index];
}
public int getSize(){
return list.size();//return this.size();
}
public void add(Object obj){
list[index++]=obj;
size++;
}
}
5.Test
public class Test{
public static void main(String[] args){
List list = new ListImpl();
list.add("a");
list.add("b");
list.add("c");
//第一种迭代方法
Iterator it = list.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
System.out.println("==========");
//第二种迭代方式
for(int i=0;i<list.getSize();i++){
System.out.println(list.get(i));
}
}
}
result
a
b
c
==========
a
b
c