模式定义
迭代模式提供了一种方法顺序用来访问一个聚合对象中的各个元素, 而又不需暴露该对象的内部表示。如今该模式已被java集成到了util类库中,我们常常可以同过Collection接口以及其下的Iterator来进行集合遍历的操作。
使用方法
迭代模式使用next或者previous等的方法提供给外部一种可遍历的功能。
使用范围
- 访问一个聚合对象的内容而无需暴露它的内部表示。
- 支持对聚合对象的多种遍历。
- 为遍历不同的聚合结构提供一个统一的接口(即, 支持多态迭代)。
举例说明
假设现在有一个DVD库,提供给外界的功能是顺序地可以访问这个库中的每一个DVD,它不提供增加和删除功能,只要求访问。如此可以定义一个接口暴露给外界DvdListIterator。
public interface DvdListIterator { public void first(); public void next(); public boolean isDone(); public String currentItem(); }
而DVD库本身的增加或删除修改的操作交给内部DvdList完成,同时提供createIterator()方法返回DvdListIterator的一个实现给外部访问,该实现为DvdList的一个只读类,隐藏了DvdList的内部对象的实现:InnerIterator 。是不是有点像java.util中的Collection.iterater()方法呢?该方法交由外部进行遍历访问。
public class DvdList { private String[] titles; private int titleCount; private int arraySize; public DvdList() { titles = new String[3]; titleCount = 0; arraySize = 3; } public int count() { return titleCount; } public void append(String titleIn) { if (titleCount >= arraySize) { String[] tempArray = new String[arraySize]; for (int i = 0; i < arraySize; i++){ tempArray[i] = titles[i]; } titles = null; arraySize = arraySize + 3; titles = new String[arraySize]; for (int i = 0; i < (arraySize - 3); i++) { titles[i] = tempArray[i]; } } titles[titleCount++] = titleIn; } public void delete(String titleIn) { boolean found = false; for (int i = 0; i < (titleCount -1); i++) { if (found == false) { if (titles[i].equals(titleIn)) { found = true; titles[i] = titles[i + 1]; } } else { if (i < (titleCount -1)) { titles[i] = titles[i + 1]; } else { titles[i] = null; } } } if (found == true) { --titleCount; } } public DvdListIterator createIterator() { return new InnerIterator(); } private class InnerIterator implements DvdListIterator { private int currentPosition = 0; private InnerIterator() {} public void first() { currentPosition = 0; } public void next() { if (currentPosition < (titleCount)) { ++currentPosition; } } public boolean isDone() { if (currentPosition >= (titleCount)) { return true; } else { return false; } } public String currentItem() { return titles[currentPosition]; } } }
接下来,观察外部如何访问DvdList并遍历它内部的所有对象:
DvdListIterator dvdMoviesIterator = dvdMovies.createIterator();
public class IteratorClient { public static void main(String[] args) { DvdList dvdMovies = new DvdList(); dvdMovies.append("Movie 1"); dvdMovies.append("Movie 2"); dvdMovies.append("Movie 3"); dvdMovies.append("Movie 4"); dvdMovies.append("Movie 5"); dvdMovies.append("Movie 6"); DvdListIterator dvdMoviesIterator = dvdMovies.createIterator(); while (!dvdMoviesIterator.isDone()) { System.out.println(dvdMoviesIterator.currentItem()); dvdMoviesIterator.next(); } dvdMovies.delete("Movie 4"); System.out.println(" "); dvdMoviesIterator.first(); while (!dvdMoviesIterator.isDone()) { System.out.println(dvdMoviesIterator.currentItem()); dvdMoviesIterator.next(); } } }
运行结果
Movie 1 Movie 2 Movie 3 Movie 4 Movie 5 Movie 6 Movie 1 Movie 2 Movie 3 Movie 5 Movie 6
下载示例