迭代器模式:提供一種方法順序訪問一個聚合對象中的各個元素,而又不是暴露其內部的表示
案例:菜單項目的打印
代碼:
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:一個類應該只有一個引起變化的原因
重點:儘量讓類保持單一責任