迭代器模式曾经是一种最常见、最简单的设计模式,提供了一种顺序访问某个集合中所有元素的解决方案,而不用了解元素的底层操作。现在的新兴语言都将迭代器集成了进去,但是了解迭代器模式的实现对理解面向对象开发而言仍然尤其意义。
GOF对迭代器模式的定义是:提供一种方法顺序访问聚合对象中的各个元素,而又不暴露该对象的内部表示。以筛选简历简单演示下。
//抽象聚集类代码
public abstract class Aggregate {
public abstract Iterator CreateIterator();
}
//一个具体的聚集类
public class ConcreteAggregate extends Aggregate {
private List<Object> items = new ArrayList<Object>();
@Override
public Iterator CreateIterator() {
// return new ConcreteI;
return null;
}
public int getSize() {
return items.size();
}
public Object getItem(int index) {
return items.get(index);
}
public void setItem(int index, Object obj) {
items.add(index, obj);
}
}
//抽象的迭代器代码
public abstract class Iterator {
public abstract Object First();
public abstract Object Next();
public abstract Boolean IsDone();
public abstract Object CurrentItem();
}
//具体的迭代器代码
public class ConcreteIterator extends Iterator {
private ConcreteAggregate aggregate;
private int current = 0;
public ConcreteIterator(ConcreteAggregate aggregate) {
super();
this.aggregate = aggregate;
}
@Override
public Object First() {
// TODO Auto-generated method stub
return this.aggregate.getItem(0);
}
@Override
public Object Next() {
Object obj = null;
current++;
if(current < this.aggregate.getSize())
obj = this.aggregate.getItem(current);
return obj;
}
@Override
public Boolean IsDone() {
if(current >= this.aggregate.getSize())
return true;
else
return false;
}
@Override
public Object CurrentItem() {
// TODO Auto-generated method stub
return this.aggregate.getItem(current);
}
}
客户端实现
public class Client {
public static void main(String[] args) {
ConcreteAggregate aggregate = new ConcreteAggregate();
for(int i = 0;i<10;i++) {
aggregate.setItem(i, "求职者" + (i +1));
}
Iterator iterator = new ConcreteIterator(aggregate);
while(!iterator.IsDone()) {
System.out.println(iterator.CurrentItem() + "请于明日14:00来我司面试");
iterator.Next();
}
}
}
运行截图
迭代器是为容器而生的,其本质就是一种遍历算法。在迭代器模式中,通常会提供一个外部的迭代器以便对当前聚合对象进行遍历和访问,迭代器定义的是一个访问该聚合元素的接口,并且可以跟踪当前所遍历的元素,以便了解那些元素已经遍历过而那些没有被遍历过。
以上内容,整理自刘径舟,张玉华编著的《设计模式其实很简单》读书笔记,欢迎转载