迭代器模式: 类似java中的Iterator类,提供一种方法顺序访问一个聚合对象中各个元素。
// 书籍类
public class Book {
private String name = "";
public Book(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
// 迭代器抽象类,执行元素递增,具有类似循环变量的功能
public interface Iterator {
public abstract boolean hasNext();
public abstract Object next();
}
// 书架迭代器类
public class BookShelfIterator implements Iterator {
private BookShelf bookShelf; // 书架
private int index; // 书所在位置索引
public BookShelfIterator(BookShelf bookShelf) {
this.bookShelf = bookShelf;
this.index = 0;
}
public boolean hasNext() { // 检查是否还有下一本书
if (index < bookShelf.getLength()) {
return true;
} else {
return false;
}
}
public Object next() { // 返回下一位置的书
Book book = bookShelf.getBookAt(index);
index++;
return book;
}
}
// 聚集抽象类
public interface Aggregate {
public abstract Iterator iterator();
}
// 具体聚集类
public class BookShelf implements Aggregate {
private Book[] books;
private int index = 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[index] = book;
index++;
}
public int getLength() { // 获得书架存书的数量
return books.length;
}
public Iterator iterator() { // 获得书架迭代器对象
return new BookShelfIterator(this);
}
}
public class Main {
public static void main(String[] args) {
// 生成一个书架
BookShelf bookShelf = new BookShelf(4);
// 向书架添加书籍
bookShelf.appendBook(new Book("周恩来的晚年岁月"));
bookShelf.appendBook(new Book("C++网络编程"));
bookShelf.appendBook(new Book("J2EE网络编程精解"));
bookShelf.appendBook(new Book("Java编程思想"));
// 获得书架迭代器
Iterator it = bookShelf.iterator();
while (it.hasNext()) {
Book book = (Book) it.next();
System.out.println(book.getName());
}
}
}
总的来说,迭代器模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以不暴露集合的内部结构,又可以让外部代码透明地访问集合内部的数据。迭代器模式在访问数组,集合,对数据库进行操作时使用的非常普遍,由于它太普遍了,所以各种高级语言都对它进行封装,所以给人感觉此模式本身不太常用。