时间: 2019-04-29
1.1 Iterator模式概念
Iterator模式: 用于在数据集合中按照顺序遍历集合。英文单词Iterator有反复做某件事的意思,汉语称为“迭代器”。
1.2 示例程序
实现了Iterator模式的示例程序。示例程序的作用是将书(Book)放置到书架(BookShelf)中, 并将书的名字按顺序显示出来。

Aggregate接口
Aggregate接口是一个遍历的集合的接口, 即迭代器。实现了该接口的类将称为一个可以保存多个元素的集合, 就像数组一样。Aggregate有“使聚集”,“集合”的意思。
public interface Aggregate {
// 此方法生成一个用于遍历集合的迭代器.
public abstract Iterator iterator();
}
Iterator接口
Iterator接口用于遍历集合中的元素,其作用相当于循环语句中的循环变量。
public interface Iterator {
/**
* 判断是否存在下一个元素。 hasNext方法主要用于循环终止条件。
* @return true-存在;false-不存在(遍历至集合末尾)
*/
public abstract boolean hasNext();
/**
* 返回集合中的下一个元素。(在Iterator接口的实现类的next方法隐含着将迭代器移动至下一个元素的处理)
* @return Object=集合中的一个元素。
*/
public abstract Object next();
}
Book 类
Book类是表示书的类。
public class Book {
// 成员变量: 书名
private String name;
// 构造函数: 构造Book对象时要传入书名.
public Book(String name) {
this.name = name;
}
// 获取书的名字
public String getName() {
return name;
}
}
BookSelf类
BookShelf类是表示书架的类。由于需要将该类作为集合进行处理,因此它实现了Aggregate接口。
public class BookShelf implements Aggregate {
// 成员变量: 定义一个数组,数组中存放Book
private Book[] books;
// 代表book在数组中的位子
private int last = 0;
// 构造函数: 创建BookShelf对象, 要确认书架的容量/大小.
public BookShelf(int maxsize) {
this.books = new Book[maxsize];
}
// 根据位置取出相应的书
public Book getBookAt(int index) {
return books[index];
}
// 向书架上放书. 将book存入数组中
public void appendBook(Book book) {
this.books[last] = book;
last++;
}
// 获取目前的存书量
public int getLength() {
return last;
}
// 实现Aggregate的方法: 创建一个书架的迭代器
public Iterator iterator() {
return new BookShelfIterator(this);
}
}
BookShelfIterator类
BookShelfIterator用于遍历书架.
实现Iterator 接口的原因: 需要发挥Iterator 的作用.
public class BookShelfIterator implements Iterator {
// 成员变量: 书架
private BookShelf bookShelf;
// 成员变量: 书架的位置
private int index;
// 构造函数: 构建一个书架的迭代器, 初始位置0
public BookShelfIterator(BookShelf bookShelf) {
this.bookShelf = bookShelf;
this.index = 0;
}
// 实现Iterator方法: 判断是否书架中是否还有书.
public boolean hasNext() {
// 迭代器的位置小于当前的实际容量, 则存在下一个; 否则,没有下一个了
if (index < bookShelf.getLength()) {
return true;
} else {
return false;
}
}
// 按迭代器的位置取出书架中的书, 并将迭代器指向下一个.
public Object next() {
Book book = bookShelf.getBookAt(index);
index++;
return book;
}
}
Main类
使用Main类来制作一个小书架
public class Main {
public static void main(String[] args) {
// 创建一个能容纳4本书的书架
BookShelf bookShelf = new BookShelf(4);
// 向书架中加书
bookShelf.appendBook(new Book("Around the World in 80 Days"));
bookShelf.appendBook(new Book("Bible"));
bookShelf.appendBook(new Book("Cinderella"));
bookShelf.appendBook(new Book("Daddy-Long-Legs"));
// 构建书架的迭代器(通过BookShelfIterator实现: 构造函数将收到的BookShelf实例保存在bookShelf字段中, 将index初始化为0)
Iterator it = bookShelf.iterator();
// hasNext判断当书架中还有书时,使用next按顺序取出书架中的书.
while (it.hasNext()) {
Book book = (Book)it.next();
System.out.println(book.getName());
}
}
}
1.3 Iterator模式中登场的角色
-
Iterator(迭代器)
该角色负责定义按顺序逐个遍历元素的接口(API).
在示例中,由Iterator接口扮演这个角色. - ConcreteIterator(具体的迭代器)
该角色负责实现Iterator角色所定义的接口(API)
在示例中, 由BookShelfIterator类扮演这个角色. - ConcreteAggregate(具体的集合)''
该角色负责实现Aggregate角色所定义的接口API(). 它会创建出具体的Iterator角色, 即ConcreteIterator角色
在示例中, 由BookShelf扮演这个角色, 它实现了iterator方法.
网友评论