迭代器模式
迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。
要点:
1、迭代器模式把在元素之间游走的责任交给迭代器,而不是聚合对象。这样简化了聚合的接口和实现,也让责任各得其所。
2、迭代器模式常见的方法有hasNext()、next()、remove()方法等。
HeadFirst中的迭代器模式实现
1、创建迭代器接口
package Iterator;
/**
* 迭代器接口
*/
public interface Iterator {
public boolean hasNext();
public Object next();
}
2、创建菜单项
package Iterator;
public class MenuItem {
String name;
double price;
public MenuItem(String name, double price) {
this.name = name;
this.price = price;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
}
3、创建具体的菜单迭代器
package Iterator;
import java.util.ArrayList;
/**
* 煎饼屋菜单迭代器
*/
public class PancakeHouseMenuIterator implements Iterator {
/**
* 列表形式的菜单项
*/
public ArrayList<MenuItem> menuItems;
int position = 0;
public PancakeHouseMenuIterator(ArrayList<MenuItem> items) {
this.menuItems = items;
}
@Override
public boolean hasNext() {
if (position < menuItems.size()) {
return true;
}
return false;
}
@Override
public Object next() {
if (!this.hasNext()) {
return null;
}
MenuItem item = menuItems.get(position);
position = position + 1;
return item;
}
}
package Iterator;
public class DinerMenuIterator implements Iterator{
public MenuItem[] menuItems;
int position = 0;
public DinerMenuIterator(MenuItem[] menuItems) {
this.menuItems = menuItems;
}
@Override
public boolean hasNext() {
if (position < menuItems.length) {
return true;
}
return false;
}
@Override
public Object next() {
if (!this.hasNext()) {
return null;
}
MenuItem item = menuItems[position];
position = position + 1;
return item;
}
}
4、创建菜单接口
package Iterator;
public interface Menu {
// 创建迭代器
public Iterator createIterator();
}
5、创建具体的菜单
package Iterator;
import java.util.ArrayList;
/**
* 煎饼屋菜单
*/
public class PancakeHouseMenu implements Menu {
public ArrayList<MenuItem> menuItems;
public PancakeHouseMenu() {
menuItems = new ArrayList<MenuItem>();
menuItems.add(new MenuItem("Regular Pancake Breakfast", 2.99));
menuItems.add(new MenuItem("Blueberry Pancakes", 3.49));
menuItems.add(new MenuItem("Waffles", 3.59));
}
@Override
public Iterator createIterator() {
return new PancakeHouseMenuIterator(menuItems);
}
}
package Iterator;
/*
餐厅菜单
*/
public class DinerMenu implements Menu {
public MenuItem[] menuItems;
public DinerMenu() {
menuItems = new MenuItem[3];
menuItems[0] = new MenuItem("BLT", 2.99);
menuItems[1] = new MenuItem("Soup of the day", 3.29);
menuItems[2] = new MenuItem("Hotdog", 3.05);
}
@Override
public Iterator createIterator() {
return new DinerMenuIterator(menuItems);
}
}
6、创建女招待
package Iterator;
/**
* 女招待
*/
public class Waitress {
Menu pancakeHouseMenu;
Menu dinerMenu;
public Waitress(Menu pancakeHouseMenu, Menu dinerMenu) {
this.pancakeHouseMenu = pancakeHouseMenu;
this.dinerMenu = dinerMenu;
}
public void printMenu() {
// 获取菜单迭代器
Iterator pancakeIterator = pancakeHouseMenu.createIterator();
Iterator dinerIterator = dinerMenu.createIterator();
// 使用迭代器打印菜单
System.out.println("----MENU----\n");
System.out.println("BREAKFASE:");
printMenu(pancakeIterator);
System.out.println("\nLUNCH:");
printMenu(dinerIterator);
}
private void printMenu(Iterator iterator) {
while (iterator.hasNext()) {
MenuItem menuItem = (MenuItem)iterator.next();
System.out.println(menuItem.getName() + ", " + menuItem.getPrice());
}
}
}
7、使用女招待打印菜单
package Iterator;
public class Test {
public static void main(String[] args) {
// 菜单
Menu pancakeHouseMenu = new PancakeHouseMenu();
Menu dinerMenu = new DinerMenu();
// 女招待
Waitress waitress = new Waitress(pancakeHouseMenu, dinerMenu);
// 打印菜单
waitress.printMenu();
}
}