跳转到内容

Java迭代器模式

来自代码酷

迭代器模式(Iterator Pattern)是设计模式中一种行为型模式,它提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。迭代器模式将遍历逻辑从聚合对象中分离出来,使得聚合对象和迭代算法可以独立变化。

概述[编辑 | 编辑源代码]

迭代器模式的核心思想是:

  • 提供统一的接口来遍历不同类型的集合(如数组、链表、树等)。
  • 客户端无需关心集合的内部结构,只需通过迭代器接口访问元素。

迭代器模式包含以下主要角色:

  • 迭代器接口(Iterator):定义遍历集合的通用方法(如 `hasNext()`, `next()`)。
  • 具体迭代器(ConcreteIterator):实现迭代器接口,负责管理当前遍历位置。
  • 聚合接口(Aggregate):定义创建迭代器的方法(如 `createIterator()`)。
  • 具体聚合类(ConcreteAggregate):实现聚合接口,返回具体迭代器的实例。

代码示例[编辑 | 编辑源代码]

以下是一个简单的迭代器模式实现,模拟遍历一个字符串集合:

  
// 迭代器接口  
interface Iterator<T> {  
    boolean hasNext();  
    T next();  
}  

// 聚合接口  
interface Aggregate<T> {  
    Iterator<T> createIterator();  
}  

// 具体聚合类(字符串集合)  
class StringCollection implements Aggregate<String> {  
    private String[] items;  

    public StringCollection(String[] items) {  
        this.items = items;  
    }  

    @Override  
    public Iterator<String> createIterator() {  
        return new StringIterator(items);  
    }  
}  

// 具体迭代器  
class StringIterator implements Iterator<String> {  
    private String[] items;  
    private int position = 0;  

    public StringIterator(String[] items) {  
        this.items = items;  
    }  

    @Override  
    public boolean hasNext() {  
        return position < items.length;  
    }  

    @Override  
    public String next() {  
        return items[position++];  
    }  
}  

// 客户端代码  
public class IteratorDemo {  
    public static void main(String[] args) {  
        String[] strings = {"Apple", "Banana", "Cherry"};  
        Aggregate<String> collection = new StringCollection(strings);  
        Iterator<String> iterator = collection.createIterator();  

        while (iterator.hasNext()) {  
            System.out.println(iterator.next());  
        }  
    }  
}

输出:

  
Apple  
Banana  
Cherry  

代码解析[编辑 | 编辑源代码]

1. `Iterator` 接口定义了遍历集合的基本操作。 2. `StringCollection` 是具体聚合类,通过 `createIterator()` 返回一个 `StringIterator` 实例。 3. `StringIterator` 实现了迭代逻辑,客户端通过 `hasNext()` 和 `next()` 遍历元素。

实际应用场景[编辑 | 编辑源代码]

迭代器模式在以下场景中非常有用:

  • **集合类库**:Java 的 `java.util.Iterator` 是迭代器模式的经典实现,例如 `ArrayList.iterator()`。
  • **数据库查询结果**:遍历数据库查询返回的记录集。
  • **文件系统遍历**:递归访问目录中的文件。

Java 集合框架中的迭代器[编辑 | 编辑源代码]

Java 内置了迭代器模式的支持,例如:

  
List<String> list = Arrays.asList("One", "Two", "Three");  
Iterator<String> iterator = list.iterator();  
while (iterator.hasNext()) {  
    System.out.println(iterator.next());  
}

类图[编辑 | 编辑源代码]

以下是迭代器模式的类图表示:

classDiagram class Iterator { <<interface>> +hasNext() boolean +next() T } class ConcreteIterator { -items: T[] -position: int +hasNext() boolean +next() T } class Aggregate { <<interface>> +createIterator() Iterator<T> } class ConcreteAggregate { -items: T[] +createIterator() Iterator<T> } ConcreteAggregate --> ConcreteIterator : creates ConcreteIterator ..|> Iterator ConcreteAggregate ..|> Aggregate

优缺点[编辑 | 编辑源代码]

优点:

  • 单一职责原则:将遍历逻辑与集合分离。
  • 开闭原则:可以新增迭代器而不修改集合代码。
  • 支持并行遍历:多个迭代器可以独立遍历同一集合。

缺点:

  • 对于简单集合,可能增加代码复杂度。
  • 某些语言(如 Java)已内置迭代器支持,直接使用现成接口更高效。

总结[编辑 | 编辑源代码]

迭代器模式是处理集合遍历的通用解决方案,尤其适合需要隐藏集合内部结构的场景。通过标准化遍历接口,它提升了代码的灵活性和可维护性。Java 开发者应熟悉 `java.util.Iterator` 的用法,并在自定义集合时考虑实现迭代器模式。