版权声明:转载请注明出处: https://blog.csdn.net/qq_21687635/article/details/84958770
模式定义
迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。
下图是该模式的类图:
一个生动的例子
迭代器接口:
public interface Iterator<E> {
boolean hasNext();
E next();
}
聚合体接口:
public interface Menu<T> {
Iterator<T> createIterator();
}
聚合体具体类:
public class DinerMenu implements Menu<MenuItem> {
private static final int MAX_ITEMS = 4;
private int numberOfItems = 0;
private MenuItem[] menuItems;
public DinerMenu() {
menuItems = new MenuItem[MAX_ITEMS];
addItem("Diner A", "Diner A", true, 2.99);
addItem("Diner B", "Diner B", false, 3.99);
addItem("Diner C", "Diner C", true, 4.99);
addItem("Diner D", "Diner D", false, 5.99);
}
public void addItem(String name, String description, boolean vegetarian, double price) {
if (numberOfItems >= MAX_ITEMS) {
System.err.println("sorry, menu is full! can't add item to menu");
} else {
MenuItem menuItem = new MenuItem(name, description, vegetarian, price);
menuItems[numberOfItems] = menuItem;
numberOfItems++;
}
}
@Override
public Iterator<MenuItem> createIterator() {
return new DinerMenuIterator(menuItems);
}
}
迭代器具体类:
public class DinerMenuIterator implements Iterator<MenuItem> {
private MenuItem[] items;
int position = 0;
public DinerMenuIterator(MenuItem[] menuItems) {
this.items = menuItems;
}
@Override
public boolean hasNext() {
if (position >= items.length || items[position] == null) {
return false;
} else {
return true;
}
}
@Override
public MenuItem next() {
MenuItem menuItem = items[position];
position++;
return menuItem;
}
}
客户端类:
public class Waitress {
private DinerMenu dinerMenu;
public Waitress(DinerMenu dinerMenu) {
this.dinerMenu = dinerMenu;
}
public void printMenu() {
Iterator<MenuItem> dinerIterator = dinerMenu.createIterator();
System.out.println("\n----- dinerItems -----");
printMenu(dinerIterator);
}
private void printMenu(Iterator<MenuItem> iterator) {
while (iterator.hasNext()) {
MenuItem menuItem = iterator.next();
System.out.println(menuItem);
}
}
}
其实Java源码中也有相应的接口,Iterable接口相当于上面的聚合体接口,也就是对应的Menu接口;Iterator接口相当于上面的迭代器接口,也就是对应的Iterator接口。
参考
- Head First 设计模式[书籍]