迭代器模式:提供一种方法顺序访问一个聚合对象中的各个元素,而又不是暴露其内部的表示
案例:菜单项目的打印
代码:
public interface Menu {
public Iterator createIterator();
}
public interface Iterator {
public boolean hasNext();
public Object next();
}
public class DinerMenu implements Menu {
private final static int MAX_ITEMS = 6;
private int numberOfItems = 0;
private MenuItem[] menuItems;
public DinerMenu() {
menuItems = new MenuItem[MAX_ITEMS];
addItem("Vegetarian BLT", "", true, 2.99);
addItem("BLT", "", false, 2.99);
addItem("Hotdog", "", false, 3.29);
}
public void addItem(String name, String description, boolean vegetarian, double price) {
MenuItem menuItem = new MenuItem(name, description, vegetarian, price);
if (numberOfItems >= MAX_ITEMS) {
System.out.println("Sorry, menu is full!");
} else {
menuItems[numberOfItems] = menuItem;
numberOfItems += 1;
}
}
@Override
public Iterator createIterator() {
return new DinerMenuIterator(menuItems);
}
}
public class DinerMenuIterator implements Iterator {
private MenuItem[] menuItems;
private int position;
public DinerMenuIterator(MenuItem[] items) {
menuItems = items;
position = 0;
}
@Override
public boolean hasNext() {
if (position >= menuItems.length || menuItems[position] == null) {
return false;
}
return true;
}
@Override
public Object next() {
MenuItem item = menuItems[position];
position += 1;
return item;
}
}
public class PatternDemo {
public static void main(String[] args) {
print(new DinerMenu());
}
public static void print(Menu menu) {
Iterator i = menu.createIterator();
while (i.hasNext()) {
MenuItem item = (MenuItem)i.next();
System.out.println("Name: " + item.getName()
+ ", Price: " + item.getPrice());
}
}
}
当然,其实JDK里面已经提供了java.util.Iterator接口供我们使用,同样可以用DinerMenuIterator类实现这个接口,然后实现hasNext(), next(), remove()三个方法
注,remove()是指移除调用了next()后返回的那个值的那一项。
另外,如果在类中使用的不是数组结构,而是JDK里面提供的容器类,例如ArrayList,或者LinkedList,那么它们本身就已经实现了java.util.Iterator,因此在在返回Iterator方法中可以直接调用JDK实现好的,例如:
import java.util.ArrayList;
import java.util.Iterator;
public class PancakeHouseMenu {
private ArrayList<MenuItem> list;
public PancakeHouseMenu() {
list = new ArrayList<MenuItem>();
addItem("Vegetarian BLT", "", true, 2.99);
addItem("BLT", "", false, 2.99);
addItem("Hotdog", "", false, 3.29);
}
public void addItem(String name, String description, boolean vegetarian, double price) {
MenuItem menuItem = new MenuItem(name, description, vegetarian, price);
list.add(menuItem);
}
public Iterator createIterator() {
return list.iterator();
}
}
设计原则9:一个类应该只有一个引起变化的原因
重点:尽量让类保持单一责任