迭代器模式(Iterator Pattern)
迭代器模式是一种行为设计模式,它提供了一种方法来顺序访问一个聚合对象中的各个元素,而无需暴露该对象的内部表示。它主要用于遍历集合对象(如列表、树等)。
概念
- 迭代器(Iterator):定义访问和遍历元素的接口。
- 具体迭代器(Concrete Iterator):实现迭代器接口,并负责管理遍历集合中的元素。
- 聚合(Aggregate):定义创建相应迭代器对象的接口。
- 具体聚合(Concrete Aggregate):实现创建相应迭代器对象的接口,该迭代器用于遍历聚合本身。
优点
- 支持多种遍历:可以同时有多个遍历在同一集合上进行,每个迭代器保持其自己的遍历状态。
- 解耦集合对象与遍历方式:提供一种统一的接口遍历集合元素,但具体遍历的实现细节被封装在迭代器中。
- 提高集合类的通用性和复用性:由于遍历集合的责任被分离出去,集合本身的设计可以更加专注于管理元素的任务。
缺点
- 增加系统复杂度:需要额外的迭代器对象,可能会增加系统的复杂度。
- 对于简单的遍历操作,使用迭代器模式可能会有些过于繁琐。
Java代码示例
假设我们有一个书籍集合,想要提供一种方法来遍历集合中的所有书籍,不暴露集合的内部结构。
java复制代码
// 聚合接口
interface Aggregate {
Iterator createIterator();
}
// 具体聚合
class BookCollection implements Aggregate {
private String[] books;
// 构造器与其他方法...
public BookCollection(String[] books) {
this.books = books;
}
@Override
public Iterator createIterator() {
return new BookIterator(this);
}
public String[] getBooks() {
return books;
}
}
// 迭代器接口
interface Iterator {
boolean hasNext();
Object next();
}
// 具体迭代器
class BookIterator implements Iterator {
private BookCollection collection;
private int position = 0;
public BookIterator(BookCollection collection) {
this.collection = collection;
}
@Override
public boolean hasNext() {
return position < collection.getBooks().length;
}
@Override
public Object next() {
if (this.hasNext()) {
return collection.getBooks()[position++];
}
return null;
}
}
// 客户端使用示例
public class IteratorDemo {
public static void main(String[] args) {
String[] books = {"Design Patterns", "Refactoring", "Clean Code"};
BookCollection collection = new BookCollection(books);
Iterator iterator = collection.createIterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}
}
在这个例子中,BookCollection
类实现了 Aggregate
接口,并提供了创建 BookIterator
的方法。BookIterator
是具体的迭代器,负责遍历书籍集合。客户端通过 BookCollection
创建一个迭代器,然后使用这个迭代器遍历所有书籍,而无需知道书籍集合的内部结构。