本文介绍迭代器模式的概念和应用。
基本思想和原则
迭代器模式提供一种方法访问一个容器对象中的各个元素,而又不需要暴露该对象的内部细节。
动机
迭代器模式有两个主要的使用动机:封装性和统一的访问模式。现在很多语言都提供了现成的迭代器模式实现,比如Java中的各种Collection类型:ArrayList、Set、HashMap等,大部分情况下我们不用自己去实现迭代器模式,只要使用现成的集合类型即可。
实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
| public class Book { private ArrayList<Page> pageArrayList = new ArrayList<Page>();
public void add(Page page) { this.pageArrayList.add(page); }
public void remove(Page page) { this.pageArrayList.remove(page); }
public IBookIterator iterator() { return new IBookIterator(this.pageArrayList); } }
public class IBookIterator implements Iterator { private ArrayList<Page> pageArrayList; private int currentIdx = 0;
public IBookIterator(ArrayList<Page> bookArrayList) { this.pageArrayList = bookArrayList; }
public boolean hasNext() { return currentIdx < this.pageArrayList.size(); }
@Override public Page next() { return (Page)this.pageArrayList.get(this.currentIdx++); }
}
public class Page { private int pageNumber;
public Page(int pageNumber) { this.pageNumber = pageNumber; }
public int getPageNumber() { return pageNumber; } }
public class Test { public static void main(String[] args) { Book book = new Book(); book.add(new Page(1)); book.add(new Page(2)); book.add(new Page(3)); book.add(new Page(4)); book.add(new Page(5));
IBookIterator bookIterator = book.iterator(); while (bookIterator.hasNext()) { Page page = bookIterator.next(); System.out.println("Page number: " + page.getPageNumber()); }
} }
|
输出如下:
1 2 3 4 5
| Page number: 1 Page number: 2 Page number: 3 Page number: 4 Page number: 5
|
上面的代码模拟了一本书翻页的过程,一本书中包含很多页面,这就是一个应用迭代模式的场景。Book
类有有一个iterator
方法,这个方法会返回一个IBookIterator
类型的书中页面的迭代器,IBookIterator
类实现了Iterator
接口中的hasNext
和next
方法。
优点
封装性好,提供统一的访问模式。