迭代器模式
迭代器模式(Iterator Pattern)是一种行为型设计模式,它使得客户端可以在不暴露集合内部结构的情况下,逐个访问集合中的元素。这种设计模式的主要目的是分离集合的遍历算法和集合本身,使得两者可以独立变化。
模式结构
迭代器模式通常由以下几个角色组成:
- 迭代器角色(Iterator):定义了获取迭代器的接口,通常会包含
next()
、hasNext()
等方法。 - 具体迭代器角色(Concrete Iterator):实现了迭代器接口,维护对集合的引用并实现迭代的逻辑。
- 聚合角色(Aggregate):定义创建迭代器的接口。
- 具体聚合角色(Concrete Aggregate):实现聚合接口,返回一个具体的迭代器。
代码示例
下面用 Java 代码来演示迭代器模式的实现。假设我们要实现一个简单的书籍集合,并可以通过迭代器遍历书籍。
import java.util.ArrayList;
import java.util.List;
// 迭代器接口
interface Iterator<T> {
boolean hasNext();
T next();
}
// 具体迭代器
class BookIterator implements Iterator<Book> {
private BookCollection bookCollection;
private int index;
public BookIterator(BookCollection bookCollection) {
this.bookCollection = bookCollection;
this.index = 0;
}
@Override
public boolean hasNext() {
return index < bookCollection.getSize();
}
@Override
public Book next() {
return bookCollection.getBookAt(index++);
}
}
// 聚合接口
interface Aggregate {
Iterator<Book> createIterator();
}
// 具体聚合
class BookCollection implements Aggregate {
private List<Book> books;
public BookCollection() {
books = new ArrayList<>();
}
public void addBook(Book book) {
books.add(book);
}
public Book getBookAt(int index) {
return books.get(index);
}
public int getSize() {
return books.size();
}
@Override
public Iterator<Book> createIterator() {
return new BookIterator(this);
}
}
// 书籍类
class Book {
private String title;
public Book(String title) {
this.title = title;
}
public String getTitle() {
return title;
}
}
// 客户端代码
public class Demo {
public static void main(String[] args) {
BookCollection bookCollection = new BookCollection();
bookCollection.addBook(new Book("Java 设计模式"));
bookCollection.addBook(new Book("Effective Java"));
bookCollection.addBook(new Book("深入理解 Java 虚拟机"));
Iterator<Book> iterator = bookCollection.createIterator();
while (iterator.hasNext()) {
Book book = iterator.next();
System.out.println("书籍标题: " + book.getTitle());
}
}
}
代码解析
- Iterator接口:定义了
hasNext()
和next()
方法,用于遍历集合元素。 - BookIterator类:实现了
Iterator
接口,保存对BookCollection
的引用,能够逐个访问书籍。 - Aggregate接口:定义了创建迭代器的方法。
- BookCollection类:实现了
Aggregate
接口,提供了添加书籍和获取书籍的方法,同时返回迭代器的实例。 - Book类:代表书籍对象,包含书名属性。
- Demo类:客户端代码,通过
BookCollection
添加书籍,并通过迭代器遍历输出书籍标题。
结论
迭代器模式提供了一种统一的方式去遍历不同集合对象,增加了程序的灵活性和可维护性。在实现复杂集合的遍历时,迭代器模式的引入可以极大地降低代码的耦合度。同时,由于迭代器的存在,集合内部的实现细节被隐藏,有助于实现代码的高内聚性。在实际开发中,迭代器模式常被广泛应用于Collections框架中,体现了其重要性和实用性。