1. 项目结构
bash
iterator-pattern-demo/
├── pom.xml
├── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── example/
│ │ │ └── iterator/
│ │ │ ├── Main.java
│ │ │ ├── aggregate/
│ │ │ │ ├── BookCollection.java
│ │ │ │ └── Library.java
│ │ │ ├── iterator/
│ │ │ │ ├── BookIterator.java
│ │ │ │ └── LibraryIterator.java
│ │ │ └── model/
│ │ │ └── Book.java
│ │ └── resources/
└── test/
Maven配置文件 (pom.xml)
xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>iterator-pattern-demo</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>Iterator Pattern Demo</name>
<description>Demo project for Iterator Design Pattern</description>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- 可以添加测试依赖 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
2. 代码实现
-
创建实体类 Book.java
javapackage com.example.iterator.model; /** * 书籍实体类 */ public class Book { private String title; private String author; private String isbn; private int year; public Book(String title, String author, String isbn, int year) { this.title = title; this.author = author; this.isbn = isbn; this.year = year; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } public String getIsbn() { return isbn; } public void setIsbn(String isbn) { this.isbn = isbn; } public int getYear() { return year; } public void setYear(int year) { this.year = year; } @Override public String toString() { return String.format("Book{title='%s', author='%s', isbn='%s', year=%d}", title, author, isbn, year); } } -
通用迭代器接口
javapackage com.example.iterator.iterator; import java.util.Iterator; /** * 自定义迭代器接口 - 通常我们直接使用Java内置的Iterator接口 * 这里为了演示,我们创建自己的接口,同时展示两种方式 */ public interface BookIterator<T> extends Iterator<T> { // 可以添加自定义方法 boolean hasNext(); T next(); } -
具体迭代器实现
javapackage com.example.iterator.iterator; import com.example.iterator.model.Book; import java.util.List; /** * 书籍集合迭代器 */ public class LibraryIterator implements BookIterator<Book> { private List<Book> books; private int position = 0; public LibraryIterator(List<Book> books) { this.books = books; } @Override public boolean hasNext() { return position < books.size() && books.get(position) != null; } @Override public Book next() { if (!hasNext()) { return null; } Book book = books.get(position); position++; return book; } @Override public void remove() { if (position <= 0) { throw new IllegalStateException("必须先调用next()才能调用remove()"); } if (books.get(position - 1) != null) { books.remove(position - 1); position--; } } } -
聚合接口
javapackage com.example.iterator.aggregate; import com.example.iterator.iterator.BookIterator; import com.example.iterator.model.Book; /** * 聚合接口 - 定义创建迭代器的方法 */ public interface BookCollection { BookIterator<Book> createIterator(); void addBook(Book book); void removeBook(Book book); int size(); } -
具体聚合实现
javapackage com.example.iterator.aggregate; import com.example.iterator.iterator.BookIterator; import com.example.iterator.iterator.LibraryIterator; import com.example.iterator.model.Book; import java.util.ArrayList; import java.util.List; /** * 具体聚合类 - 图书馆 */ public class Library implements BookCollection { private List<Book> books; private String name; public Library(String name) { this.name = name; this.books = new ArrayList<>(); } public Library(String name, List<Book> initialBooks) { this.name = name; this.books = new ArrayList<>(initialBooks); } @Override public BookIterator<Book> createIterator() { return new LibraryIterator(books); } @Override public void addBook(Book book) { books.add(book); } @Override public void removeBook(Book book) { books.remove(book); } @Override public int size() { return books.size(); } public String getName() { return name; } // 使用Java内置的Iterable接口实现迭代 - 另一种方式 public Iterable<Book> getIterable() { return books; // ArrayList本身实现了Iterable接口 } // 使用Java 8的Stream API进行迭代 - 现代方式 public void printAllBooksUsingStream() { books.stream() .forEach(book -> System.out.println("Stream: " + book)); } } -
另一种聚合实现
javapackage com.example.iterator.aggregate; import com.example.iterator.iterator.BookIterator; import com.example.iterator.model.Book; import java.util.Arrays; import java.util.Iterator; /** * 使用数组实现的聚合类 */ public class ArrayBookCollection implements BookCollection, Iterable<Book> { private Book[] books; private int count = 0; public ArrayBookCollection(int capacity) { this.books = new Book[capacity]; } @Override public BookIterator<Book> createIterator() { return new BookIterator<Book>() { private int index = 0; @Override public boolean hasNext() { return index < count; } @Override public Book next() { if (hasNext()) { return books[index++]; } return null; } }; } @Override public void addBook(Book book) { if (count < books.length) { books[count] = book; count++; } else { throw new IllegalStateException("集合已满"); } } @Override public void removeBook(Book book) { for (int i = 0; i < count; i++) { if (books[i].equals(book)) { // 移动元素 for (int j = i; j < count - 1; j++) { books[j] = books[j + 1]; } books[count - 1] = null; count--; break; } } } @Override public int size() { return count; } // 实现Iterable接口,支持foreach循环 @Override public Iterator<Book> iterator() { return new Iterator<Book>() { private int index = 0; @Override public boolean hasNext() { return index < count; } @Override public Book next() { if (hasNext()) { return books[index++]; } throw new java.util.NoSuchElementException(); } @Override public void remove() { throw new UnsupportedOperationException("remove"); } }; } // 使用Java 8的Arrays.stream()方法 public void printAllBooksUsingArraysStream() { Arrays.stream(books, 0, count) .forEach(book -> System.out.println("Array Stream: " + book)); } } -
主程序 Main.java
javapackage com.example.iterator; import com.example.iterator.aggregate.ArrayBookCollection; import com.example.iterator.aggregate.BookCollection; import com.example.iterator.aggregate.Library; import com.example.iterator.iterator.BookIterator; import com.example.iterator.model.Book; /** * 迭代器模式演示主类 */ public class Main { public static void main(String[] args) { System.out.println("========== 迭代器模式演示 ==========\n"); // 1. 创建图书馆实例 Library library = new Library("市图书馆"); // 2. 添加一些书籍 library.addBook(new Book("设计模式:可复用面向对象软件的基础", "Erich Gamma等", "978-7-111-07575-4", 2000)); library.addBook(new Book("Java编程思想", "Bruce Eckel", "978-7-111-21382-6", 2007)); library.addBook(new Book("Effective Java", "Joshua Bloch", "978-7-111-58978-9", 2018)); library.addBook(new Book("深入理解Java虚拟机", "周志明", "978-7-111-54783-4", 2018)); System.out.println("=== 使用自定义迭代器遍历图书馆 ==="); BookIterator<Book> iterator = library.createIterator(); while (iterator.hasNext()) { Book book = iterator.next(); System.out.println(book); } System.out.println("\n=== 使用Java内置的Iterable接口(foreach) ==="); for (Book book : library.getIterable()) { System.out.println("Foreach: " + book.getTitle()); } System.out.println("\n=== 使用Java 8 Stream API ==="); library.printAllBooksUsingStream(); System.out.println("\n=== 测试数组实现的集合 ==="); ArrayBookCollection arrayCollection = new ArrayBookCollection(5); arrayCollection.addBook(new Book("测试书籍1", "作者1", "ISBN-001", 2020)); arrayCollection.addBook(new Book("测试书籍2", "作者2", "ISBN-002", 2021)); arrayCollection.addBook(new Book("测试书籍3", "作者3", "ISBN-003", 2022)); System.out.println("使用自定义迭代器:"); BookIterator<Book> arrayIterator = arrayCollection.createIterator(); while (arrayIterator.hasNext()) { System.out.println(arrayIterator.next()); } System.out.println("\n使用Java foreach语法:"); for (Book book : arrayCollection) { System.out.println("Array foreach: " + book.getTitle()); } System.out.println("\n使用Java 8 Arrays.stream():"); arrayCollection.printAllBooksUsingArraysStream(); // 3. 演示迭代器的删除功能 System.out.println("\n=== 演示迭代器的remove方法 ==="); Library library2 = new Library("测试图书馆"); library2.addBook(new Book("待删除的书", "匿名作者", "ISBN-DEL", 2020)); library2.addBook(new Book("保留的书", "知名作者", "ISBN-KEEP", 2021)); System.out.println("删除前书籍数量: " + library2.size()); BookIterator<Book> deleteIterator = library2.createIterator(); while (deleteIterator.hasNext()) { Book book = deleteIterator.next(); if ("待删除的书".equals(book.getTitle())) { deleteIterator.remove(); System.out.println("已删除: " + book.getTitle()); } } System.out.println("删除后书籍数量: " + library2.size()); System.out.println("\n========== 演示结束 =========="); } /** * 通用方法:使用迭代器遍历任何书籍集合 */ public static void iterateBooks(BookCollection collection) { System.out.println("\n通用遍历方法:"); BookIterator<Book> iterator = collection.createIterator(); while (iterator.hasNext()) { Book book = iterator.next(); System.out.println("遍历: " + book.getTitle()); } } } -
测试类
javapackage com.example.iterator; import com.example.iterator.aggregate.Library; import com.example.iterator.model.Book; import org.junit.Test; import static org.junit.Assert.*; /** * 迭代器模式测试类 */ public class IteratorPatternTest { @Test public void testLibraryIterator() { Library library = new Library("测试图书馆"); library.addBook(new Book("测试书籍", "测试作者", "ISBN-001", 2023)); assertEquals(1, library.size()); int count = 0; var iterator = library.createIterator(); while (iterator.hasNext()) { iterator.next(); count++; } assertEquals(1, count); } @Test public void testRemoveBookViaIterator() { Library library = new Library("测试图书馆"); Book bookToRemove = new Book("待删除", "作者", "ISBN-DEL", 2023); Book bookToKeep = new Book("保留", "作者", "ISBN-KEEP", 2023); library.addBook(bookToRemove); library.addBook(bookToKeep); assertEquals(2, library.size()); var iterator = library.createIterator(); while (iterator.hasNext()) { Book book = iterator.next(); if ("待删除".equals(book.getTitle())) { iterator.remove(); } } assertEquals(1, library.size()); } }
3. 构建和运行
-
使用Maven编译:
bashmvn clean compile -
运行主程序:
bashmvn exec:java -Dexec.mainClass="com.example.iterator.Main"或者:
bashjava -cp target/classes com.example.iterator.Main -
运行测试:
bashmvn test -
打包项目:
bashmvn package
4. 核心概念
- 分离了集合对象的遍历行为:将遍历逻辑从集合对象中分离出来,放到迭代器对象中。
- 支持多种遍历方式:可以为同一个集合提供多种不同的遍历方式。
- 简化了集合接口:集合本身不需要暴露内部结构。
- 支持并行遍历:多个迭代器可以同时遍历同一个集合。
- 与Java集合框架的集成:Java的Collection框架广泛使用了迭代器模式。