迭代器模式(Iterator Pattern)是一种行为型设计模式,其主要目的是提供一种顺序访问聚合对象(如列表、集合、数组等)元素的方法,而不暴露其内部结构。通过迭代器模式,客户端可以访问聚合对象的元素而无需了解其具体实现方式。
假设我们有一个书架,上面摆放着许多书籍。我们想逐一查看每一本书的标题,但是不想去了解书架内部是如何组织书籍的。这时候,我们可以把书架比作一个聚合对象,每本书就是聚合对象中的一个元素。
现在,我们想要一种方式能够顺序地查看每一本书的标题,但又不想直接去操作书架内部的结构。这时候,我们可以使用迭代器模式。在这个例子中,迭代器就像是一个书签,帮助你记录你读到的当前书籍,同时提供了一种标准的方法来获取下一本书的标题。
当我们需要查看书架上的书籍时,你可以使用迭代器来顺序地访问每本书的标题,而不用担心书架内部的具体排列方式。这样,你就可以专注于阅读每本书的内容,而不必去关心书籍是如何组织的。
主要角色:
- 迭代器接口(Iterator): 定义了遍历元素的操作接口。
- 具体迭代器(Concrete Iterator): 实现了迭代器接口,负责实现具体的遍历操作。
- 聚合接口(Aggregate): 定义了创建迭代器对象的接口。
- 具体聚合类(Concrete Aggregate): 实现了聚合接口,负责创建具体迭代器。
- 客户端(Client): 使用迭代器遍历聚合对象的元素。
示例:
使用java实现一下上边书架的例子假设有一个名为 Book
的类,表示一本书,而 BookShelf
是一个存储书籍的书架。
java
package com.luke.designpatterns.iteratorPattern;
import java.util.ArrayList;
import java.util.List;
// 迭代器接口
interface Iterator<T> {
boolean hasNext();
T next();
}
// 具体迭代器
class BookIterator implements Iterator<Book> {
private List<Book> books;
private int index;
public BookIterator(List<Book> books) {
this.books = books;
this.index = 0;
}
@Override
public boolean hasNext() {
return index < books.size();
}
@Override
public Book next() {
if (hasNext()) {
return books.get(index++);
}
return null;
}
}
// 聚合接口
interface Aggregate<T> {
Iterator<T> iterator();
}
// 具体聚合类
class BookShelf implements Aggregate<Book> {
private List<Book> books;
public BookShelf() {
this.books = new ArrayList<>();
}
public void addBook(Book book) {
books.add(book);
}
@Override
public Iterator<Book> iterator() {
return new BookIterator(books);
}
}
// 书籍类
class Book {
private String title;
public Book(String title) {
this.title = title;
}
public String getTitle() {
return title;
}
}
// 客户端代码
public class Client {
public static void main(String[] args) {
BookShelf bookShelf = new BookShelf();
bookShelf.addBook(new Book("深究设计模式"));
bookShelf.addBook(new Book("代码整洁之道"));
bookShelf.addBook(new Book("深入理解java虚拟机"));
Iterator<Book> iterator = bookShelf.iterator();
while (iterator.hasNext()) {
Book book = iterator.next();
System.out.println("书: " + book.getTitle());
}
}
}
在这个例子中,Iterator
是迭代器接口,BookIterator
是具体迭代器,实现了对书籍列表的顺序遍历。Aggregate
是聚合接口,BookShelf
是具体聚合类,负责创建迭代器。客户端通过调用聚合对象的 iterator()
方法获取迭代器,然后使用迭代器遍历聚合对象的元素。迭代器模式使得客户端与聚合对象的结构解耦,客户端只需关注迭代器的接口,而不需要了解聚合对象的内部结构。这样可以更灵活地对聚合对象进行遍历操作。
适用场景
- 集合类的迭代:在处理集合类对象时,迭代器模式非常有用。例如,遍历一个列表、数组或集合中的元素,而不暴露其内部结构。
- 文件系统遍历:当需要递归地遍历文件系统中的文件和文件夹时,迭代器模式可以提供一种统一的接口,让客户端能够顺序地访问文件和文件夹,而不必深入了解文件系统的实际实现细节。
- 数据库结果集处理:在数据库查询中,迭代器模式可以用来逐行遍历查询结果集,而不必关心数据库的底层实现和查询语句的执行细节。
- 菜单遍历:在图形用户界面中,当有一个菜单或选项列表时,迭代器模式可以帮助以一种通用的方式遍历并访问每个菜单项,而不需要了解菜单的内部结构。
- 树结构遍历:在处理树状结构数据时,迭代器模式可以提供一种统一的方式来遍历树的节点,无需暴露树的具体实现。
- 网络数据流处理:在处理网络数据流时,迭代器模式可以用来逐个处理接收到的数据包,而不用直接操作网络连接的底层细节。
总体而言,迭代器模式适用于需要遍历一个集合对象而又不想暴露其内部结构的场景,提供了一种简洁而统一的方法来访问集合中的元素。