迭代器模式
WARNING
迭代器模式使用价值远不如学习价值,Martin Flower 提出撤销此模式。C#
,Java
等高级编程语言已经把这个模式做在自己语言中。
但是,”研究历史为了更好地迎接未来“
迭代器模式(Iterator Pattern)是行为设计模式的一种,它提供了一种访问集合对象元素的方式,而又不需要暴露集合内部的细节。这种模式定义了一个接口来遍历集合对象,而不需要知道集合的具体实现。这样,用户代码就可以以统一的方式处理不同类型的集合,提高了代码的灵活性和可扩展性。
类图
主要角色
- 迭代器(Iterator):定义了访问和遍历集合元素的接口,包括获取下一个元素、判断是否还有下一个元素等方法。
- 具体迭代器(ConcreteIterator):实现了迭代器接口,负责对特定集合类型进行遍历。
- 集合(Aggregate):定义了创建相应迭代器对象的接口。
- 具体集合(ConcreteAggregate):实现了集合接口,负责创建具体的迭代器对象。
优点
- 分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可以让外部代码透明地访问集合内部的数据
示例
java
// 迭代器接口
interface Iterator<T> {
boolean hasNext();
T next();
}
// 集合接口
interface Aggregate<T> {
Iterator<T> createIterator();
}
// 具体迭代器实现
class ConcreteIterator<T> implements Iterator<T> {
private T[] items;
private int position = 0;
public ConcreteIterator(T[] items) {
this.items = items;
}
@Override
public boolean hasNext() {
return position < items.length && items[position] != null;
}
@Override
public T next() {
T item = items[position];
position++;
return item;
}
}
// 具体集合实现
class ConcreteAggregate<T> implements Aggregate<T> {
private T[] items;
public ConcreteAggregate(T[] items) {
this.items = items;
}
@Override
public Iterator<T> createIterator() {
return new ConcreteIterator<>(items);
}
}
public class Main {
public static void main(String[] args) {
// 创建具体集合对象
Integer[] numbers = {1, 2, 3, 4, 5};
Aggregate<Integer> aggregate = new ConcreteAggregate<>(numbers);
// 使用迭代器遍历集合元素
Iterator<Integer> iterator = aggregate.createIterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}
}