Java迭代器模式
迭代器模式提供统一方式遍历聚合对象,不暴露内部结构。
模式定义
意图:提供顺序访问聚合对象元素的方法,不暴露内部表示。
适用场景
- 需要统一遍历不同集合
- 不想暴露集合内部结构
- 需要多种遍历方式
模式结构
迭代器接口
Java
public interface Iterator<T> {
boolean hasNext();
T next();
}
聚合接口
Java
public interface Aggregate<T> {
Iterator<T> createIterator();
}
具体聚合
Java
public class Bookshelf implements Aggregate<Book> {
private Book[] books;
private int size;
public Bookshelf(int capacity) {
this.books = new Book[capacity];
}
public void addBook(Book book) {
if (size < books.length) {
books[size++] = book;
}
}
public Book getBookAt(int index) {
return books[index];
}
public int getSize() {
return size;
}
@Override
public Iterator<Book> createIterator() {
return new BookshelfIterator(this);
}
}
具体迭代器
Java
public class BookshelfIterator implements Iterator<Book> {
private Bookshelf bookshelf;
private int index = 0;
public BookshelfIterator(Bookshelf bookshelf) {
this.bookshelf = bookshelf;
}
@Override
public boolean hasNext() {
return index < bookshelf.getSize();
}
@Override
public Book next() {
if (hasNext()) {
return bookshelf.getBookAt(index++);
}
return null;
}
}
使用示例
Java
Bookshelf bookshelf = new Bookshelf(3);
bookshelf.addBook(new Book("Java入门"));
bookshelf.addBook(new Book("设计模式"));
bookshelf.addBook(new Book("算法导论"));
Iterator<Book> iterator = bookshelf.createIterator();
while (iterator.hasNext()) {
Book book = iterator.next();
System.out.println(book.getTitle());
}
Java内置迭代器
Java集合框架内置Iterator接口:
Java
List<String> list = new ArrayList<>();
list.add("A");
list.add("B");
list.add("C");
// 使用迭代器
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
String item = iterator.next();
System.out.println(item);
}
// 使用forEach(Java 8+)
list.forEach(System.out::println);
// 使用增强for循环
for (String item : list) {
System.out.println(item);
}
迭代器删除元素
Java
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
String item = iterator.next();
if ("B".equals(item)) {
iterator.remove(); // 安全删除当前元素
}
}
注意:迭代过程中直接调用list.remove()会抛ConcurrentModificationException
双向迭代器
Java
public interface BidirectionalIterator<T> extends Iterator<T> {
boolean hasPrevious();
T previous();
}
// ListIterator实现双向遍历
ListIterator<String> listIterator = list.listIterator();
while (listIterator.hasNext()) {
System.out.println(listIterator.next());
}
while (listIterator.hasPrevious()) {
System.out.println(listIterator.previous());
}
不同遍历方式
Java
// 正向遍历
Iterator<Book> forwardIterator = bookshelf.createIterator();
// 反向遍历
Iterator<Book> reverseIterator = bookshelf.createReverseIterator();
迭代器模式优点
- 统一遍历方式,简化客户端
- 不暴露集合内部结构
- 支持多种遍历方式
- 同一集合可多个迭代器同时遍历
注意事项
遍历过程中修改集合需使用迭代器的remove()
迭代器实现应保证hasNext()和next()一致性
Java集合已内置迭代器,通常无需自定义
foreach底层就是迭代器
要点总结
- 迭代器模式统一遍历聚合对象
- Iterator接口定义hasNext()和next()
- Aggregate接口创建迭代器
- Java集合框架已实现迭代器模式
- 遍历时删除元素使用iterator.remove()
📝 发现内容有误?点击此处直接编辑