迭代器模式
1 概述
- 迭代器模式(Iterator Pattern)是一种行为型设计模式,它提供了一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。迭代器模式通过将集合对象的迭代逻辑封装到迭代器对象中,使得客户端可以使用一致的方法遍历不同的集合对象。
- 这种模式通过引入迭代器接口和具体迭代器类,将集合对象的遍历操作与集合对象本身分离,从而实现遍历算法的多样性和集合对象的独立性。
2 优缺点及应用场景
2.1 优点
- 1)简化客户端代码:客户端可以使用统一的接口遍历不同的集合对象,无需了解集合的内部实现。
- 2)支持多种遍历方式:可以根据需要实现不同的迭代器,以支持多种遍历方式。
- 3)符合单一职责原则:迭代器模式将集合对象的遍历行为从集合类中分离出来,使得集合类和迭代器类各自负责不同的职责。
2.2 缺点
- 1)增加了类的数量:每一个集合类都需要一个对应的迭代器类,增加了系统的复杂性。
- 2)不支持并发修改:在遍历集合的过程中,如果集合对象发生变化,可能会导致迭代器的行为不确定。
2.3 应用场景
- 1)Java 中的 Iterator:Java 集合框架中的迭代器用于遍历集合元素。
- 2)访问集合对象:需要遍历一个集合对象的各个元素时,可以使用迭代器模式。
- 3)支持多种遍历方式:需要实现多种遍历算法时,可以使用迭代器模式。
- 4)统一遍历接口:需要为不同的集合对象提供统一的遍历接口时,可以使用迭代器模式。
3 结构
- 1)迭代器(Iterator):定义访问和遍历元素的接口。
- 2)具体迭代器(ConcreteIterator):实现迭代器接口,负责具体的遍历操作。
- 3)聚合(Aggregate):定义创建迭代器的接口。
- 4)具体聚合(ConcreteAggregate):实现聚合接口,返回具体迭代器的实例。
4 实现
4.1 UML 类图

4.2 代码示例
interface Iterator {
public boolean hasNext();
public Object next();
}
interface Container {
public Iterator getIterator();
}
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;
}
}
}
public class IteratorPatternDemo {
public static void main(String[] args) {
NameRepository namesRepository = new NameRepository();
for (Iterator iter = namesRepository.getIterator(); iter.hasNext(); ) {
String name = (String) iter.next();
System.out.println("Name : " + name);
}
}
}
Name : Robert
Name : John
Name : Julie
Name : Lora
5 总结
- 迭代器模式通过引入迭代器接口和具体迭代器类,将集合对象的遍历操作与集合对象本身分离,实现了遍历算法的多样性和集合对象的独立性。迭代器模式适用于需要遍历集合对象、支持多种遍历方式以及提供统一遍历接口的场景。尽管迭代器模式增加了类的数量,但它在简化客户端代码、支持多种遍历方式和符合单一职责原则方面具有显著优势。在实际应用中,需要根据具体需求合理使用迭代器模式,以实现灵活可扩展的系统设计。