迭代器模式(Iterator Pattern)是一种行为设计模式,它使得我们能够顺序地访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。迭代器模式为遍历不同的聚合结构提供了一个统一的接口,使得客户端代码可以独立于聚合对象的变化。
迭代器模式结构
迭代器模式主要由以下几个角色组成:
- 迭代器(Iterator):定义访问和遍历元素的接口。
- 具体迭代器(Concrete Iterator):实现迭代器接口,并跟踪遍历中的当前位置。
- 聚合(Aggregate):定义创建迭代器对象的接口。
- 具体聚合(Concrete Aggregate):实现聚合接口,返回一个具体迭代器的实例。
- 客户端(Client):持有对聚合对象和迭代器的引用,并调用迭代器的接口来遍历聚合对象。
迭代器模式优点
- 支持以不同方式遍历一个聚合:通过提供不同的迭代器,可以支持不同的遍历方式。
- 简化聚合的接口:聚合对象不再需要暴露其内部表示,只需要提供一个创建迭代器的方法。
- 对聚合对象的修改更加安全:因为客户端代码是通过迭代器来访问聚合对象的,所以聚合对象的内部表示可以被隐藏和保护起来。
迭代器模式示例
假设我们有一个BookCollection
(书籍集合)类,它包含多个Book
对象。我们想要遍历这个集合并访问其中的每一本书。我们可以使用迭代器模式来实现这个功能。
聚合接口和具体聚合
// 聚合接口
interface BookCollection {
Iterator<Book> createIterator();
}
// 具体聚合
class MyBookCollection implements BookCollection {
private List<Book> books = new ArrayList<>();
// 添加书籍到集合中
public void addBook(Book book) {
books.add(book);
}
// 创建迭代器
@Override
public Iterator<Book> createIterator() {
return new BookIterator(books.iterator());
}
}
迭代器接口和具体迭代器
// 迭代器接口
interface Iterator<T> {
boolean hasNext();
T next();
}
// 具体迭代器
class BookIterator implements Iterator<Book> {
private Iterator<Book> iterator;
public BookIterator(Iterator<Book> iterator) {
this.iterator = iterator;
}
@Override
public boolean hasNext() {
return iterator.hasNext();
}
@Override
public Book next() {
return iterator.next();
}
}
客户端代码
// 客户端代码
public class Client {
public static void main(String[] args) {
BookCollection bookCollection = new MyBookCollection();
bookCollection.addBook(new Book("Java设计模式"));
bookCollection.addBook(new Book("C++编程思想"));
// 获取迭代器并遍历集合
Iterator<Book> iterator = bookCollection.createIterator();
while (iterator.hasNext()) {
Book book = iterator.next();
System.out.println(book.getTitle());
}
}
}
// Book类(示例用)
class Book {
private String title;
public Book(String title) {
this.title = title;
}
public String getTitle() {
return title;
}
}
在上面的示例中,我们定义了一个BookCollection
接口和一个MyBookCollection
具体聚合类,以及一个Iterator
接口和一个BookIterator
具体迭代器类。客户端代码通过调用MyBookCollection
的createIterator
方法来获取一个迭代器,并使用这个迭代器来遍历集合中的书籍。这样,我们就实现了迭代器模式。