迭代子模式(Iterator Pattern)
迭代子模式(Iterator Pattern)是一种常用的设计模式,属于行为型模式。它提供一种方法顺序访问一个聚合对象中的各个元素,而又无需暴露该对象的内部表示。
核心组件
- Iterator(迭代器):提供一种方法访问聚合对象的元素,而不需要暴露该聚合对象的内部结构。
- Aggregate(聚合):定义创建相应迭代器对象的接口。
- ConcreteIterator(具体迭代器):实现迭代器接口,完成集合的遍历。
- ConcreteAggregate(具体聚合):实现创建迭代器的接口,返回一个适合该聚合的迭代器。
适用场景
- 访问一个聚合对象的内容而无需暴露它的内部表示:
- 使用迭代器模式可以分离集合对象的遍历行为,抽象出一个迭代器来负责遍历的职责。
- 需要对聚合有多种方式遍历时:
- 迭代器模式可以实现多种遍历策略,甚至可以同时进行多个遍历。
- 为遍历不同的聚合结构提供一个统一的接口:
- 当聚合结构变化时,你只需要调整迭代器,而无需修改聚合对象。
实现实例
以书籍集合为例,我们创建一个书籍聚合和对应的迭代器:
聚合接口(Aggregate Interface)
此接口定义了一个创建迭代器的方法。任何实现了 Aggregate
接口的聚合类都必须提供这个方法,用于生成遍历自身元素的迭代器。
public interface Aggregate {
Iterator createIterator();
}
这里的 createIterator()
方法返回一个 Iterator
类型的对象,这个对象用于遍历聚合中的元素。
具体聚合(Concrete Aggregate)
BookCollection
类实现了 Aggregate
接口,表明它是一个可以被遍历的聚合。它持有一个书籍列表(List),并提供方法来添加书籍和创建迭代器。
public class BookCollection implements Aggregate {
private List<Book> books;
public BookCollection() {
this.books = new ArrayList<>();
}
public void addBook(Book book) {
books.add(book);
}
public Iterator createIterator() {
return new BookIterator(books);
}
}
这个类不仅存储书籍数据,还通过 createIterator()
方法生成一个专门用于遍历书籍的 BookIterator
对象。
迭代器接口(Iterator Interface)
迭代器接口定义了遍历聚合对象所需的基本方法,如 hasNext()
和 next()
。
public interface Iterator {
boolean hasNext();
Object next();
}
hasNext()
方法检查是否还有更多元素可遍历。next()
方法返回聚合中的下一个元素。
具体迭代器(Concrete Iterator)
BookIterator
类实现了 Iterator
接口,专门用于遍历书籍列表。
public class BookIterator implements Iterator {
private List<Book> books;
private int index;
public BookIterator(List<Book> books) {
this.books = books;
this.index = 0;
}
public boolean hasNext() {
return index < books.size();
}
public Book next() {
if (hasNext()) {
return books.get(index++);
}
return null;
}
}
这个类维护一个指向当前遍历位置的索引,并利用 hasNext()
和 next()
方法逐个访问书籍列表中的书籍。
客户端代码(Client Code)
客户端代码演示了如何使用迭代子模式遍历书籍集合。
public class Client {
public static void main(String[] args) {
BookCollection collection = new BookCollection();
collection.addBook(new Book("The Great Gatsby"));
collection.addBook(new Book("War and Peace"));
Iterator iterator = collection.createIterator();
while (iterator.hasNext()) {
Book book = (Book) iterator.next();
System.out.println("Book: " + book.getName());
}
}
}
在这段代码中,客户端首先创建一个 BookCollection
对象,并添加一些书籍。然后,它通过调用 createIterator()
方法获取迭代器,并使用迭代器遍历所有书籍。
优缺点
优点
- 支持多种遍历方式:
- 迭代器模式可以让你在同一聚合上同时进行多种遍历,并且可以自定义遍历算法。
- 简化聚合接口:
- 聚合本身无需提供多种遍历方法,这简化了聚合的接口。
缺点
- 可能增加系统的复杂性:
- 引入了额外的类和接口,增加了系统的复杂性。
迭代子模式提供了一种有效的方式来独立于对象的实现,透明地访问聚合中的各个元素,适用于多种数据结构的遍历需求。