迭代器(Iterator):提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。
类图:
代码:
publicinterface Iterator {
Object first();
boolean next();
Object isDone();
int currentItem();
}
publicabstractclass Aggregate {
public List<String> messages=new ArrayList<String>();
publicintindex=0;
publicabstract Iterator CreateIterator();
}
publicclass ConcreteIterator implements Iterator {
protected Aggregate aggregate;
public ConcreteIterator(Aggregate aggregate){
this.aggregate=aggregate;
}
publicint currentItem() {
returnthis.aggregate.index;
}
public Object first() {
if(this.aggregate.messages.size()>0){
returnthis.aggregate.messages.get(0);
}else{
returnnull;
}
}
public Object isDone() {
if(this.aggregate.index<this.aggregate.messages.size()){
returnthis.aggregate.messages.get(this.aggregate.index++);
}else{
returnnull;
}
}
publicboolean next() {
if(this.aggregate.index<this.aggregate.messages.size()){
returntrue;
}else{
returnfalse;
}
}
}
publicclass ConcreteAggregate extends Aggregate {
public Iterator CreateIterator() {
returnnew ConcreteIterator(this);
}
}
publicstaticvoid main(String[] args) {
Aggregate aggregate=new ConcreteAggregate();
List<String> msg=new ArrayList<String>();
msg.add("abc");
msg.add("def");
msg.add("fhi");
msg.add("jkl");
aggregate.messages=msg;
Iterator iterator=aggregate.CreateIterator();
System.out.println(iterator.first());
while(iterator.next()){
System.out.println();
System.out.println(iterator.currentItem()+"_"+iterator.isDone());
}
}
小结:
此模式非常常用,Java和C#语言本身已经实现了迭代器模式(Foreach)。我们只需要了解他就可以了!!