Iterator模式用于在数据集合中按照顺序遍历集合。即迭代器模式。
下面来看一段实现了迭代器模式的示例程序。
这段程序的作用是将书(Book)放置到书架(BookShelf)中,并将书的名字按顺序显示出来。
首先写一个Aggregate接口,这个接口是所要遍历的集合的接口。实现了该接口的类将成为一个可以保存多个元素的集合,就像数组一样。
在Aggregate接口中声明的方法只有一个iterator()方法,该方法会生成一个用于遍历集合的迭代器。
1 package BigJunOba.bjtu.Iterator; 2 3 public interface Aggregate { 4 public abstract Iterator iterator(); 5 }
接下来写一个Iterator接口。这里声明了两个方法,即判断是否存在下一个元素的hasNext方法,和获取下一个元素的next方法。
1 package BigJunOba.bjtu.Iterator; 2 3 public interface Iterator { 4 public abstract boolean hasNext(); 5 public abstract Object next(); 6 }
然后写一个Book类。它可以做的事情只有一件,那就是通过getName方法获取书的名字。书的名字是在外部调用Book类的构造函数并初始化Book类时,作为参数传递给Book类的。
package BigJunOba.bjtu.Iterator; public class Book { private String name; public Book(String name) { this.name = name; } public String getName() { return name; } }
BookShelf类时表示书架的类。由于需要将该类作为集合进行处理,因此它实现了Aggregate接口。此外,还实现了Aggregate接口的iterator方法。
这里要注意的是iterator方法,该方法会生成并返回BookShelfIterator类的实例作为BookShelf类对应的Iterator。当外部想要遍历书架时,就会调用这个方法。
1 package BigJunOba.bjtu.Iterator; 2 3 public class BookShelf implements Aggregate { 4 5 private Book[] books; 6 private int last = 0; 7 8 public BookShelf(int maxsize) { 9 this.books = new Book[maxsize]; 10 } 11 12 public Book getBookAt(int index) { 13 return books[index]; 14 } 15 16 public void appendBook(Book book) { 17 this.books[last] = book; 18 last++; 19 } 20 21 public int getLength() { 22 return last; 23 } 24 25 @Override 26 public Iterator iterator() { 27 return new BookShelfIterator(this); 28 } 29 30 }
BookShelfIterator类用于遍历书架。
1 package BigJunOba.bjtu.Iterator; 2 3 public class BookShelfIterator implements Iterator { 4 5 private BookShelf bookShelf; 6 private int index; 7 8 public BookShelfIterator(BookShelf bookShelf) { 9 this.bookShelf = bookShelf; 10 this.index = 0; 11 } 12 13 @Override 14 public boolean hasNext() { 15 if (index < bookShelf.getLength()) { 16 return true; 17 } else { 18 return false; 19 } 20 } 21 22 @Override 23 public Object next() { 24 Book book = bookShelf.getBookAt(index); 25 index++; 26 return book; 27 } 28 29 }
接下来使用Main类来制作一个小书架。
1 package BigJunOba.bjtu.Iterator; 2 3 public class Main { 4 public static void main(String[] args) { 5 BookShelf bookShelf = new BookShelf(4); 6 bookShelf.appendBook(new Book("Around the World in 80 Days")); 7 bookShelf.appendBook(new Book("Bible")); 8 bookShelf.appendBook(new Book("Cinderella")); 9 bookShelf.appendBook(new Book("Daddy Long Legs")); 10 Iterator it = bookShelf.iterator(); 11 while (it.hasNext()) { 12 Book book = (Book) it.next(); 13 System.out.println(book.getName()); 14 } 15 } 16 }
输出结果如下。
1 Around the World in 80 Days
2 Bible
3 Cinderella
4 Daddy Long Legs
示例程序类图和Iterator模式的类图。
Iterator模式的类图。