迭代器模式(Iterator)
迭代器模式一般含有
-
Iterator
(迭代器):抽象类(或接口),指定hasNext和next方法,前者用于判断是否存在下一个元素,后者用于获取当前元素并指向下一个元素 -
Aggregate
(集合):抽象类(或接口),定义集合的迭代器方法,用于获取集合的一个Iterator(迭代器)类 -
ConcreteAggregate
(具体的集合) -
ConcreteIterator
(具体的迭代器)
迭代器模式的类图:
示例程序:遍历书架上的书
-
类图:
-
Aggregate
接口public interface Aggregate { public abstract Iterator iterator(); }
-
Iterator
接口public interface Iterator { public abstract boolean hasNext(); public abstract Object next(); }
-
Book
类public class Book { private String name; public Book(String name) { this.name = name; } public String getName() { return name; } }
-
BookShelf
类public class BookShelf implements Aggregate { private Book[] books; private int last=0; public BookShelf(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 getLength() { return last; } public Iterator iterator() { return new BookShelfIterator(this); } }
-
BookShelfIterator
类public class BookShelfIterator implements Iterator { private BookShelf bookShelf; private int index; public BookShelfIterator(BookShelf bookShelf) { this.bookShelf = bookShelf; } public boolean hasNext() { return index < bookShelf.getLength(); } public Object next() { Book book = bookShelf.getBookAt(index); index++; return book; } }
-
IteratorMain
public class IteratorMain { public static void main(String[] args) { 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")); Iterator iterator = bookShelf.iterator(); while (iterator.hasNext()) { Book book = (Book) iterator.next(); System.out.println(book.getName()); } } }
迭代器模式的好处:
-
将遍历与实现分离开来,将遍历功能置于Aggregate角色之外。Main中的while循环并不依赖于BookShelf的实现。如果后期改用Vector来代替现在的数组管理书本,可以很方便地修改少部分代码(
BookShelf
类的getBookAt()
,appendBook()
以及构造方法BookShelf()
)就完成复用。只需要修改实现部分的代码而不需要修改遍历部分的代码。修改后的
BookShelf
类import java.awt.print.Book; import java.util.Vector; public class BookShelf implements Aggregate { private Vector<Book> books; private int last=0; public BookShelf(int maxSize) { this.books=new Vector<>(maxSize); } public Book getBookAt(int index) { return books.get(index); } public void appendBook(Book book) { books.add(book) last++; } public int getLength() { return last; } public Iterator iterator() { return new BookShelfIterator(this); } }