一、概述
提供一种方法顺序访问一个聚合对象中各个元素,而又不暴漏对象的内部表示。
二、设计角色
1) 迭代器角色(Iterator):迭代器角色负责定义访问和遍历元素的接口。
2) 具体迭代器角色(Concrete Iterator):具体迭代器角色要实现迭代器接口,并要记录遍历中的当前位置。
3) 容器角色(Container):容器角色负责提供创建具体迭代器角色的接口。
4) 具体容器角色(Concrete Container):具体容器角色实现创建具体迭代器角色的接口——这个具体迭代器角色于该容器的结构相关。
例子:
/*
* 迭代器抽象类
*/
public abstract class Iterator {
/*
* 获取集合中的下一个元素
*/
public abstract Object next();
/*
* 是否存在下一个元素
*/
public abstract boolean isHasNext();
}
/*
* 具体聚集类
*/
public class ConcreteAggregate {
private ArrayList<String> list;
public ConcreteAggregate(ArrayList<String> list) {
this.list = list;
}
public Iterator createIterator() {
return new ConcreteIterator();
}
public void add(String s){
this.list.add(s);
}
public void remove(String s){
this.list.remove(s);
}
/*
* 内部类:具体迭代器
*/
public class ConcreteIterator extends Iterator{
int currIndex = 0;
@Override
public Object next() {
if(currIndex<list.size()){
return list.get(currIndex++);
}else{
return null;
}
}
@Override
public boolean isHasNext() {
return currIndex<list.size()?true:false;
}
}
}
/*
* 客户端
*/
public class App {
public static void main(String[] args) {
ConcreteAggregate agg = new ConcreteAggregate(new ArrayList<String>());
agg.add("a");
agg.add("b");
agg.add("c");
agg.add("d");
agg.add("e");
agg.add("f");
Iterator iterator = agg.createIterator();
while(iterator.isHasNext()){
System.out.println(iterator.next());
}
}
}