迭代器模式
迭代器模式是一种最简单也最常见的设计模式。它可以让用户通过特定的接口巡访容器中的每一个元素而不用了解底层的实现。
结构示意图
迭代器角色(Iterator): 负责定义访问和遍历元素的接口。
具体迭代器角色(Concrete Iterator):实现迭代器接口,并要记录遍历中的当前位置。
容器角色(Container): 负责提供创建具体迭代器角色的接口。
具体容器角色(Concrete Container):实现创建具体迭代器角色的接口, 这个具体迭代器角色与该容器的结构相关
代码举例
interface Iterator{
Object First();
Object Next();
boolean IsDone();
Object CurrentItem();
}
abstract class Aggregate{
abstract Iterator CreateIterator();
}
class ConcreteIterator implements Iterator{
private List<Object> list = new ArrayList<Object>();
private int curr=0;
public ConcreteIterator(List<Object> list){
this.list = list;
}
public Object First(){
return list.get(0);
}
public Object Next(){
Object ret = null;
curr++;
if(curr < list.size()){
ret = list.get(curr);
}
return ret;
}
public boolean IsDone(){
return curr>=list.size()?true:false;
}
public Object CurrentItem(){
return list.get(curr);
}
}
class ConcreteAggregate extends Aggregate{
private List<Object> list = new ArrayList<Object>();
public ConcreteAggregate(List<Object> list){
this.list = list;
}
public Iterator CreateIterator(){
return new ConcreteIterator(list);
}
}
class client{
public static void main(String[] args){
List<Object> list = new ArrayList<Object>();
list.add("miner");
list.add("any");
Aggregate agg = new ConcreteAggregate(list);
Iterator iterator = agg.CreateIterator();
iterator.First();
while(!iterator.IsDone()){
System.out.println(iterator.CurrentItem());
iterator.Next();
}
}
}
存在问题
在巡访过程中,容器可能会被外部改变。譬如新增或删除一个元素。