Iterator (迭代器)
一、意图
提供一种方法顺序访问一个聚合对象中的各个元素,且不需要暴露该对象的内部表示。
二、结构
迭代器模式的结构图如图7-41所示。
其中:
• Iterator (迭代器)定义访问和遍历元素的接口。
• Concretelterator(具体迭代器)实现迭代器接口;对该聚合遍历时跟踪当前位置。
• Aggregate (聚合)定义创建相应迭代器对象的接口。
• ConcreteAggregate(具体聚合)实现创建相应迭代器的接口,该操作返回ConcreteIterator
的一个适当的实例。
三、适用性
Iterator模式适用于:
•访问一个聚合对象的内容而无须暴露它的内部表示。
• 支持对聚合对象的多种遍历。
• 为遍历不同的聚合结构提供一个统一的接口。
四、实现
我们将创建一个叙述导航方法的 Iterator 接口和一个返回迭代器的 Container 接口。实现了 Container 接口的实体类将负责实现 Iterator 接口。
IteratorPattern,我们的演示类使用实体类 NamesRepository 来打印 NamesRepository 中存储为集合的 Names。
首先 创建接口
。
interface Iterator {
public boolean hasNext();
public Object next();
}
interface Container {
public Iterator getIterator();
}
然后 创建实现了 Container 接口的实体类。该类有实现了 Iterator 接口的内部类 NameIterator
。
class NameRepository implements Container {
public String[] names = {"Robert" , "John" ,"Julie" , "Lora"};
@Override
public Iterator getIterator() {
return new NameIterator();
}
private class NameIterator implements Iterator {
int index;
@Override
public boolean hasNext() {
if(index < names.length){
return true;
}
return false;
}
@Override
public Object next() {
if(this.hasNext()){
return names[index++];
}
return null;
}
}
}
最后 使用 NameRepository 来获取迭代器,并打印名字
。
public class IteratorPattern {
public static void main(String[] args) {
// TODO Auto-generated method stub
NameRepository namesRepository = new NameRepository();
for(Iterator iter = namesRepository.getIterator(); iter.hasNext();){
String name = (String)iter.next();
System.out.println("Name : " + name);
}
}
}
运行结果: