行为设计模式之Iterator(迭代器)
摘要:
迭代器模式(Iterator)是一种行为设计模式,它提供顺序访问聚合对象元素的方法,同时不暴露内部结构。该模式由迭代器接口(Iterator)、具体迭代器(ConcreteIterator)、聚合接口(Aggregate)和具体聚合(ConcreteAggregate)组成,适用于需要遍历不同聚合结构的场景。示例代码展示了通过BookIterator遍历BookAggregate中的图书信息,实现了数据存储与遍历逻辑的分离。这种模式支持多种遍历方式,并为不同聚合提供统一访问接口,提高了代码的灵活性和可维护性。
1)意图
提供一种方法顺序访问一个聚合对象中的各个元素,且不需要暴露该对象的内部表示。
2)结构
其中:
- Iterator (迭代器)定义访问和遍历元素的接口。
- ConcreteIterator(具体迭代器)实现迭代器接口;对该聚合遍历时跟踪当前位置。
- Aggregate( 聚合)定义创建相应迭代器对象的接口。
- ConcreteAggregate (具体聚合)实现创建相应迭代器的接口,该操作返回 ConcreteIterator
的一个适当的实例。
3)适用性
Iterator 模式适用于:
- 访问一个聚合对象的内容而无须暴露它的内部表示。
- 支持对聚合对象的多种遍历。
- 为遍历不同的聚合结构提供一个统一的接口
import java.util.ArrayList;
import java.util.List;
public class IteratorPattern1 {
public static void main(String[] args) {
BookAggregate aggregate = new BookAggregate();
String[] books = { "java", "python", "c++", "c" };
double[] prices = { 100, 200, 300, 400 };
for (int i = 0; i < 4; i++) {
aggregate.addBook(new Book(books[i], prices[i]));
}
Iterator iterator = aggregate.createIterator();
while (iterator.hasNext()) {
Book book = (Book) iterator.next();
System.out.println("书名:" + book.getName() + " 价格:" + book.getPrice());
}
}
}
interface Iterator {
boolean hasNext();
Object next();
}
class BookIterator implements Iterator {
private int index;
private BookAggregate bookAggregate;
public BookIterator(BookAggregate bookAggregate) {
this.index = 0;
this.bookAggregate = bookAggregate;
}
@Override
public boolean hasNext() {
if (index < bookAggregate.getBookCount()) {
return true;
}
return false;
}
@Override
public Object next() {
Book book = bookAggregate.getBook(index);
index++;
return book;
}
}
class BookAggregate implements Aggregate {
private List<Book> bookList = new ArrayList<>();
public void addBook(Book book) {
bookList.add(book);
}
public Book getBook(int index) {
return bookList.get(index);
}
public int getBookCount() {
return bookList.size();
}
@Override
public Iterator createIterator() {
return new BookIterator(this);
}
}
interface Aggregate {
Iterator createIterator();
}
class Book {
private String name;
private double price;
public Book(String name, double price) {
this.name = name;
this.price = price;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
}