以下引用来自于《head first 设计模式》第九章
优越点迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。
以下引用来自于参考1
使用场景迭代器模式是一种对象行为型模式,其主要优点如下。
- 访问一个聚合对象的内容而无须暴露它的内部表示。
- 遍历任务交由迭代器完成,这简化了聚合类。
- 它支持以不同方式遍历一个聚合,甚至可以自定义迭代器的子类以支持新的遍历。
- 增加新的聚合类和迭代器类都很方便,无须修改原有代码。
- 封装性良好,为遍历不同的聚合结构提供一个统一的接口。
其主要缺点是:增加了类的个数,这在一定程度上增加了系统的复杂性。
以下引用来自于参考1
示例迭代器模式通常在以下几种情况使用。
- 当需要为聚合对象提供多种遍历方式时。
- 当需要为遍历不同的聚合结构提供一个统一的接口时。
- 当访问一个聚合对象的内容而无须暴露其内部细节的表示时。
迭代器接口
public interface Iterator {
boolean hasNext();
MenuItem next();
}
煎饼屋菜单迭代器
public class PancakeHouseMenuIterator implements Iterator {
ArrayList items;
int position = 0;
public PancakeHouseMenuIterator(ArrayList items) {
this.items = items;
}
public String next() {
String menuItem = (String) items.get(position);
position = position + 1;
return menuItem;
}
public boolean hasNext() {
if (position >= items.size()) {
return false;
} else {
return true;
}
}
}
晚餐菜单迭代器
public class DinerMenuIterator implements Iterator {
String[] items;
int position = 0;
public DinerMenuIterator(String[] items) {
this.items = items;
}
public String next() {
String menuItem = items[position];
position = position + 1;
return menuItem;
}
public boolean hasNext() {
if (position >= items.length || items[position] == null) {
return false;
} else {
return true;
}
}
}
调用遍历
public class Cafe {
public static void main(String args[]) {
PancakeHouseMenu pancakeHouseMenu = new PancakeHouseMenu();
DinerMenu dinerMenu = new DinerMenu();
// with no iterators
System.out.println("nMENUn----nBREAKFAST");
ArrayList breakfastItems = pancakeHouseMenu.getMenuItems();
for (int i = 0; i < breakfastItems.size(); i++) {
String menuItem = (String)breakfastItems.get(i);
System.out.println(menuItem);
}
System.out.println("nLUNCH");
String[] lunchItems = dinerMenu.getMenuItems();
for (int i = 0; i < lunchItems.length; i++) {
String menuItem = lunchItems[i];
System.out.println(menuItem);
}
// with iterators
Iterator pancakeIterator = pancakeHouseMenu.createIterator();
Iterator dinerIterator = dinerMenu.createIterator();
System.out.println("nMENU (with iterators)n----nBREAKFAST");
printMenu(pancakeIterator);
System.out.println("nLUNCH");
printMenu(dinerIterator);
}
private static void printMenu(Iterator iterator) {
while (iterator.hasNext()) {
String menuItem = (String)iterator.next();
System.out.println(menuItem);
}
}
}
参考
1迭代器模式(详解版)
2《head first 设计模式》



