将for循环中的变量i的作用抽象化、通用化后形成的模式被称为Iterator模式。用于在数据集合中按照顺序遍历集合。

实例程序:

Aggregate接口:

Aggregate接口是所要遍历的集合的接口。实现了该接口的类将成为一个可以保存多个元素的集合,就像数组一样。

名字 说明
Aggregate 表示集合的接口
Iterator 遍历集合的接口
Book 表示书的类
BookShelf 表示书架的类
BookShelfIterator 遍历书架的类
Main 测试程序行为的类
  1. public interface Aggregate {
  2. public abstract Iterator iterator();
  3. }

Iterator接口:

Iterator接口用于遍历集合中的元素,其作用相当于循环语句中的循环变量。

  1. public interface Iterator {
  2. public abstract boolean hasNext();
  3. public abstract Object next();
  4. }
  1. 这边声明了两个方法,即判断是否存在下一个元素的hasNext方法,和获取下一个元素的next方法。hasNext方法的返回值是boolean类型的。

Book类:

  1. public class Book {
  2. private String name;
  3. public Book(String name) {
  4. this.name = name;
  5. }
  6. public String getName() {
  7. return name;
  8. }
  9. }

BoolShelf类

BookShelf代表书架。

  1. public class BookShelf implements Aggregate {
  2. private Book[] books;
  3. private int last = 0;
  4. public BookShelf(int maxSize) {
  5. this.books = new Book[maxSize];
  6. }
  7. public Book getBookByIndex(int index) {
  8. return books[index];
  9. }
  10. public void appendBook(Book book) {
  11. this.books[last] = book;
  12. last++;
  13. }
  14. public int getLength() {
  15. return last;
  16. }
  17. @Override
  18. public Iterator iterator() {
  19. return new BookShelfIterator(this);
  20. }
  21. }

BookShelfIterator类:

  1. public class BookShelfIterator implements Iterator {
  2. private BookShelf bookShelf;
  3. private int index;
  4. public BookShelfIterator(BookShelf bookShelf) {
  5. this.bookShelf = bookShelf;
  6. this.index = 0;
  7. }
  8. @Override
  9. public boolean hasNext() {
  10. if (index< bookShelf.getLength()) {
  11. return true;
  12. }else {
  13. return false;
  14. }
  15. }
  16. @Override
  17. public Object next() {
  18. Book book = bookShelf.getBookByIndex(index);
  19. index++;
  20. return book;
  21. }
  22. }

Main

  1. public class Main {
  2. public static void main(String[] args) {
  3. BookShelf bookShelf = new BookShelf(4);
  4. bookShelf.appendBook(new Book("Around the World in 80 Days"));
  5. bookShelf.appendBook(new Book("Bible"));
  6. bookShelf.appendBook(new Book("Cinderella"));
  7. bookShelf.appendBook(new Book("Daddy-Long_Legs"));
  8. Iterator iterator = bookShelf.iterator();
  9. while (iterator.hasNext()){
  10. Book book = (Book) iterator.next();
  11. System.out.println(book.getName());
  12. }
  13. }
  14. }

拓展思路的要点:

不管实现如何变化,都可以使用Iterator:

为什么一定要考虑引入Iterator这种复杂的设计模式呢?如果是数组,直接使用for循环语句进行循环处理不可以么?为什么需要将遍历与实现分离开呢?
因为这样迭代器不依赖于BookShelf的实现。如果编写BookShelf的开发人员决定放弃用数组来管理书本,不管BookShelf如何变化,只要BookShelf的iterator方法能正确地返回Iteerator的实例(hasNext和next方法都可以正常工作),即使不对上面的while循环做任何修改,代码都可以正常工作。
这对于BookShelf的调用者来说特别方便,设计模式的作用就是帮助编写出可复用的类。所谓的可复用,就是指将类实现为“组件”,当一个组件发生变化时,不需要对其它的组件进行修改或是只需要很小的修改即可应对。

难以理解抽象类和接口:

一般人都喜欢使用具体的类来解决问题,很容易导致类之间的强耦合,这些类也难以作为组件被再次利用,为什么弱化类之间的耦合,进而使用类更加容易作为组件被再次利用,我们需要引入抽象类和接口。
所以不要只使用具体类来编程,要优先使用抽象类和接口来编程。