模式定义
迭代模式提供了一种方法顺序用来访问一个聚合对象中的各个元素, 而又不需暴露该对象的内部表示。如今该模式已被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
下载示例
本文介绍迭代模式的基本概念,通过实例展示了如何使用迭代模式遍历集合,同时保持内部数据结构的隐藏。
1552

被折叠的 条评论
为什么被折叠?



