迭代器模式(Iterator Pattern)

迭代器模式是 23 种设计模式中的一种行为型模式,它提供了一种方法来顺序访问聚合对象中的元素,而无需暴露该对象的内部表示。这种模式将遍历集合的责任从集合本身转移到迭代器对象,从而简化了集合的接口和实现。

核心原理

  • 迭代器接口(Iterator)
    定义访问和遍历元素的接口,通常包含hasNext()和next()方法
    可选地提供remove()等操作方法
  • 具体迭代器(ConcreteIterator)
    实现迭代器接口,负责管理当前遍历位置
    跟踪聚合对象中的当前位置,并能够返回下一个元素
  • 聚合接口(Aggregate)
    定义创建相应迭代器对象的接口,通常是createIterator()方法
  • 具体聚合(ConcreteAggregate)
    实现聚合接口,返回一个具体迭代器的实例
    维护聚合对象中的元素集合
    迭代器模式的核心是分离集合对象的遍历行为,使得集合对象可以专注于数据存储,而迭代器专注于遍历逻辑。

迭代器模式的核心是分离集合对象的遍历行为,使得集合对象可以专注于数据存储,而迭代器专注于遍历逻辑。

Java 实践示例

下面以一个简单的图书集合为例实现迭代器模式:

package com.example.demo;

public class IteratorPattern {
    public static void main(String[] args) {
        // 创建图书集合
        BookCollection bookCollection = new BookCollection(3);
        bookCollection.addBook(new Book("设计模式"));
        bookCollection.addBook(new Book("Java编程思想"));
        bookCollection.addBook(new Book("Clean Code"));

        // 获取迭代器并遍历
        Iterator iterator = bookCollection.createIterator();
        while (iterator.hasNext()) {
            Book book = (Book) iterator.next();
            System.out.println("图书名称: " + book.getName());
        }
    }


    // 图书实体类
    public static class Book {
        private String name;

        public Book(String name) {
            this.name = name;
        }

        public String getName() {
            return name;
        }
    }
    // 聚合接口
    public interface Aggregate {
        Iterator createIterator();
    }

    // 迭代器接口
    public interface Iterator {
        boolean hasNext();
        Object next();
    }

    // 具体聚合实现
    public static class BookCollection implements Aggregate {
        private Book[] books;
        private int index;

        public BookCollection(int capacity) {
            books = new Book[capacity];
            index = 0;
        }

        public void addBook(Book book) {
            if (index < books.length) {
                books[index] = book;
                index++;
            }
        }

        @Override
        public Iterator createIterator() {
            return new BookIterator(books);
        }
    }
    // 具体迭代器实现
    public static class BookIterator implements Iterator {
        private Book[] books;
        private int position;

        public BookIterator(Book[] books) {
            this.books = books;
            this.position = 0;
        }

        @Override
        public boolean hasNext() {
            return position < books.length && books[position] != null;
        }

        @Override
        public Object next() {
            Book book = books[position];
            position++;
            return book;
        }
    }


}

代码解析

Book 类:简单的实体类,存储图书名称
Iterator 接口:定义了迭代器的基本操作
hasNext():判断是否还有下一个元素
next():返回下一个元素并移动指针
BookIterator 类:具体的迭代器实现
持有对图书数组的引用和当前位置
实现了遍历图书集合的具体逻辑
BookCollection 类:具体的聚合实现
维护图书的存储(使用数组)
提供添加图书的方法
实现createIterator()方法,返回一个 BookIterator 实例

图书名称: 设计模式
图书名称: Java编程思想
图书名称: Clean Code

Java 中的迭代器模式应用

Java 集合框架(Collection Framework)广泛使用了迭代器模式:
java.util.Iterator接口是迭代器模式的核心
所有集合类(如ArrayList、LinkedList、HashSet等)都实现了Iterable接口,提供iterator()方法
通过for-each循环遍历集合本质上也是使用迭代器

迭代器模式的优势在于:

简化了聚合对象的接口,无需暴露内部结构
可以为同一个聚合对象提供多种不同的遍历方式
便于在遍历过程中增加新的操作(如过滤、转换)
符合单一职责原则,将数据存储和数据遍历分离
当需要遍历一个复杂集合,同时又不想暴露其内部结构时,迭代器模式是理想的选择。

更多推荐