迭代器模式:提供一种方法顺序来访问一个聚合对象中的各个元素,而又不暴露其内部的表示。
设计一个打印菜单的系统有两种菜单:PancakeHouseMenu和DinerMenu,
写一个迭代器接口:
package cn.iterator.demo; /** * 迭代器接口 * * @author wy * */ public interface Iterator { public boolean hasNext(); public Object next(); }
package cn.iterator.demo; import java.util.ArrayList; public class PancakeHouseMenu { private ArrayList menuItems; public PancakeHouseMenu() { menuItems = new ArrayList(); addItem("K&B's breakfast", "eggs and toast", true, 2.99); addItem("Regular", "eggs and sausage", false, 3.00); addItem("BlueBerry", "berries", true, 2.88); addItem("Waffles", "waffles", false, 3.01); } public void addItem(String name, String desc, Boolean vagetarian, double price) { MenuItem menuItem = new MenuItem(name, desc, vagetarian, price); menuItems.add(menuItem); } public Iterator createIterator() { return new PancakeHouseIterator(menuItems); } }
package cn.iterator.demo; public class DinerMenu { private final static int MAX_ITEMS = 6; private int numberOfItems = 0; MenuItem[] menuItems; public DinerMenu() { menuItems = new MenuItem[MAX_ITEMS]; addItem("BLT", "Fakin", true, 2.14); addItem("XX", "xxc", false, 2.87); addItem("YY", "yy", true, 6.5); addItem("ABC", "abc", true, 5.2); } public void addItem(String name, String desc, boolean vagetarian, double price) { MenuItem menuItem = new MenuItem(name, desc, vagetarian, price); if (numberOfItems >= MAX_ITEMS) { System.err.println("Sorry!the menu is full!"); } else { menuItems[numberOfItems] = menuItem; numberOfItems++; } } /** * 返回迭代器接口,客户不需要知道餐厅菜单是如何维护菜单项的,也不需要迭代器是如何实现的, 客户只需要直接使用这个迭代器来遍历菜单项即可 * * @return */ public Iterator createIterator() { return new DinnerMenuIterator(menuItems); } }
package cn.iterator.demo; public class MenuItem { private String name; private String desc; private boolean vagetarian; private double price; public MenuItem(String name, String desc, Boolean vagetarian, double price) { this.name = name; this.desc = desc; this.vagetarian = vagetarian; this.price = price; } public String getName() { return name; } public String getDesc() { return desc; } public boolean getVagetarian() { return vagetarian; } public double getPrice() { return price; } }
上面是两个菜单类,接着写下两个菜单迭代器:
package cn.iterator.demo; import java.util.ArrayList; public class PancakeHouseIterator implements Iterator { private ArrayList<MenuItem> menuItems; private int position = 0; public PancakeHouseIterator(ArrayList<MenuItem> menuItems) { this.menuItems = menuItems; } @Override public boolean hasNext() { // TODO Auto-generated method stub if (position >= menuItems.size() || menuItems.get(position) == null) { return false; } else { return true; } } @Override public Object next() { // TODO Auto-generated method stub return menuItems.get(position++); } }
package cn.iterator.demo; public class DinnerMenuIterator implements Iterator { private MenuItem[] menuItems; int position = 0; public DinnerMenuIterator(MenuItem[] menuItems) { this.menuItems = menuItems; } @Override public boolean hasNext() { // TODO Auto-generated method stub if (position >= menuItems.length || menuItems[position] == null) { return false; } else { return true; } } @Override public Object next() { // TODO Auto-generated method stub return menuItems[position++]; } }
女服务员类:
package cn.iterator.demo; /** * 女服务员类:由女服务员来打印菜单 * @author wy * */ public class Waitress { PancakeHouseMenu pancakeHouseMenu; DinerMenu dinerMenu; public Waitress(PancakeHouseMenu pancakeHouseMenu, DinerMenu dinerMenu) { this.pancakeHouseMenu = pancakeHouseMenu; this.dinerMenu = dinerMenu; } public void printMenu() { Iterator panCakeHouseIterator = pancakeHouseMenu.createIterator(); Iterator dinerMenuIterator = dinerMenu.createIterator(); System.out.println("BreakFast Menu:"); print(panCakeHouseIterator); System.out.println("Dinner Menu:"); print(dinerMenuIterator); } private void print(Iterator it) { while (it.hasNext()) { MenuItem menuItem = (MenuItem) it.next(); System.out.print("name:" + menuItem.getName()); System.out.print("---desc:" + menuItem.getDesc()); System.out.println("---price:" + menuItem.getPrice()); } System.out.println(); } }测试类:
package cn.iterator.demo; import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class Test { public static void main(String[] args) { PancakeHouseMenu pancakeHouseMenu = new PancakeHouseMenu(); DinerMenu dinerMenu = new DinerMenu(); pancakeHouseMenu.addItem("140106", "140106", true, 100); dinerMenu.addItem("140106", "140106", false, 99); Waitress waitress = new Waitress(pancakeHouseMenu, dinerMenu); waitress.printMenu(); } }