迭代器模式:
迭代器模式(Iterator Pattern)是属于行为型的设计模式,它提供了一种统一的方法来遍历不同的数据结构(如数组、集合或容器),而无需暴露这些数据结构的内部表示。通过使用迭代器,客户端代码可以访问数据集对象,而无需了解底层的数据存储方式。
角色与结构:
1 Iterator(迭代器):
- 定义了访问和遍历元素的接口,通常包含
hasNext()
(判断是否有下一个元素)、next()
(获取下一个元素)等方法。
2 ConcreteIterator(具体迭代器):
- 实现 Iterator 接口的具体迭代器类,负责跟踪当前遍历的位置,并在调用
next()
时返回相应的元素。 - 具体迭代器与具体的聚合类相关联,知道如何遍历该聚合中的元素。
3 Aggregate(聚合):
- 定义创建迭代器对象的接口,例如一个
createIterator()
方法,用于生成创建Iterator 对象。 - 聚合对象是多个对象的组合,可以是列表、集合或其他容器类型。
4 ConcreteAggregate(具体聚合):
- 提供了创建 ConcreteIterator 的实现,并实现了管理其内部元素的逻辑。
工作原理:
- 客户端调用聚合对象上的
createIterator()
方法获得一个迭代器实例。 - 客户端通过调用迭代器的
hasNext()
和next()
等方法遍历聚合中的所有元素,而不直接访问聚合的内部状态。
示例代码:
迭代器模式java示例代码:
// 聚合接口
public interface Aggregate {
void add(Object element);
void remove(Object element);
Iterator createIterator();
}
// 具体聚合类
public class ConcreteAggregate implements Aggregate {
private List<Object> elements = new ArrayList<>();
@Override
public void add(Object element) {
elements.add(element);
}
@Override
public void remove(Object element) {
elements.remove(element);
}
@Override
public Iterator createIterator() {
return new ConcreteIterator(this);
}
}
// 迭代器接口
public interface Iterator {
boolean hasNext();
Object next();
}
// 具体迭代器类
public class ConcreteIterator implements Iterator {
private ConcreteAggregate aggregate;
private int current;
public ConcreteIterator(ConcreteAggregate aggregate) {
this.aggregate = aggregate;
current = 0;
}
@Override
public boolean hasNext() {
return current < aggregate.elements.size();
}
@Override
public Object next() {
if (hasNext()) {
return aggregate.elements.get(current++);
} else {
throw new NoSuchElementException("No more elements.");
}
}
}
// 客户端代码
public class Client {
public static void main(String[] args) {
Aggregate agg = new ConcreteAggregate();
agg.add("Element1");
agg.add("Element2");
agg.add("Element3");
Iterator iterator = agg.createIterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}
}
说明:在上面代码ConcreteAggregate
类是一个具体的聚合类,它维护了一个元素列表。ConcreteIterator
类是针对 ConcreteAggregate
的具体迭代器,能够遍历聚合内的元素。客户端只需通过迭代器进行遍历,不需要关心元素是如何存储和组织的。
优点:
- 封装性:隐藏了数据集对象的内部表示,修改数据集对象不会影响到使用它的客户端代码。
- 一致性:为不同类型的聚合提供了统一的遍历方式。
- 支持多种遍历方式:可以通过定义不同类型的迭代器支持正向遍历和反向遍历遍历方式。
应用场景:
- Java 中的 Collection 框架提供的 Iterator 接口及其子接口和实现类。
- 需要遍历数据结构但不想暴露其内部细节的情况。