迭代器模式
在Java中想显示数组中的元素时,我们可以使用下面这种for方法,我们先看下下面这个示例:
public class IteratorPattern {
public static void main(String[] args) {
int[] array = {1,2,3,4,5};
for (int i = 0; i < array.length; i++) {
System.out.print(array[i] + " ");
}
}
}
这段代码很简单,代码中循环变量 i 的初始值是 0 ,然后会递增为 1 2 3 4 5,程序会在每次 i 递增后都输出 array[i],这是经常会使用到的 for 循环语句
假如将这里的循环变量 i 的作用抽象化、递用化后形成的模式,在设计模式中称为迭代模式
迭代模式示例
首先,看下下面这段代码,实现了迭代模式的示例,这段示例程序的作用是将书(Book)放到书架(BookSelf)中,并将书名的名字按顺序显示出来
Aggregate.java
interface Aggregate{
abstract Iterator iterator();
}
在Aggregate接口中声明的方法只有一个——iterator方法,该方法会生成一个用于遍历集合的迭代器。想要遍历集合中的元素时,可以调用iterator方法来生成一个实现了Iterator接口的类的实例
Iterator.java
interface Iterator{
abstract boolean hashNext();
abstract Object next();
}
这里我们声明了两个方法,即判断是否存在下一个元素的hashNext方法和获取下一个元素的方法
- hashNext方法返回的是boolean类型的
- next返回的是一个Object类型,这表明该方法返回的是集合中的一个元素。为了能够在下次调用next方法时正确地返回下一个元素,该方法中还隐含着将迭代器移动到下一个元素的处理
Book.java类(表示书名)
class Book{
private String bookName; //书名
public Book(String bookName){
this.bookName = bookName;
}
public String getBookName(){
return bookName;
}
}
BookSelf.java(表示书架类)
该类实现了Aggregate接口的iterator方法
class BookSelf implements Aggregate{
private Book[] books; //定义books字段
private int last = 0;
public BookSelf(int maxSize){
this.books = new Book[maxSize];
}
public Book getBookAt(int index){
return books[index];
}
public void appendBook(Book book){
this.books[last] = book;
last++;
}
public int getBookLength(){
return last;
}
public Iterator iterator(){
return new BookSelfIterator(this);
}
}
这个BookSelf 类中定义了books字段,它是Book类型的数组。该数组的大小(maxSize)在生成BookSelf的实例时就被指定了。之所以将books字段的可见性设置为private,是为了防止外部不小心改变了该字段的值
BookSelfIterator.java类
class BookSelfIterator implements Iterator{
private BookSelf bookSelf;
private int index;
public BookSelfIterator(BookSelf bookSelf){
this.bookSelf = bookSelf;
this.index = 0;
}
@Override
public boolean hashNext() {
if (index < bookSelf.getBookLength()){
return true;
}else{
return false;
}
}
@Override
public Object next() {
Book book = bookSelf.getBookAt(index);
index++;
return book;
}
}
关注我的公众号,一起学习