迭代器模式
迭代器模式
1将对象集合以迭代器的方式遍历输出(将遍历聚合的工作封装一个对象内),提供一个变量对象的通用接口
2定义:提供一种方法顺序范围一个聚会对象的各个元素,而又不暴露内部实现
3多态的设计思想,因为聚合对象是数组,是arrayList等,但是他们有个公共接口iterator
4对迭代器来说,数据结构可以是有序的,无序的,重复的
5空迭代器
6涉及原则
单一原则:一个类一个原则。引起变化的原因只能一个(高内聚)
案列代码
/**
*
* @author feizhou
* 描述:午餐菜单
*/
public class DinerMenuIterator implements Iterator {
MenuItem[] list;
int position = 0;
public DinerMenuIterator(MenuItem[] list) {
this.list = list;
}
public Object next() {
MenuItem menuItem = list[position];
position = position + 1;
return menuItem;
}
public boolean hasNext() {
//是否有下一个元素
if (position >= list.length || list[position] == null) {
return false;
} else {
return true;
}
}
public void remove() {
throw new UnsupportedOperationException("不支持该操作");
}
}
/**
*
* @author feizhou
* 描述:获取迭代器接口
*/
public interface Menu {
public Iterator createIterator();
}
public class DinerMenu implements Menu {
static final int MAX_ITEMS = 6;
int numberOfItems = 0;
MenuItem[] menuItems;
public DinerMenu() {
menuItems = new MenuItem[MAX_ITEMS];
addItem("牛肉饭", "牛肉饭加青菜", false, 44);
addItem("港式下午茶", "加糖港式下午茶", true, 55);
}
public void addItem(String name, String description, boolean vegetarian, double price) {
MenuItem menuItem = new MenuItem(name, description, vegetarian, price);
if (numberOfItems >= MAX_ITEMS) {
System.err.println("每人只能点6到菜");
} else {
menuItems[numberOfItems] = menuItem;
numberOfItems = numberOfItems + 1;
}
}
public MenuItem[] getMenuItems() {
return menuItems;
}
public Iterator createIterator() {
return new DinerMenuIterator(menuItems);
}
}
/**
*
* @author feizhou 描述:煎饼
*/
public class PancakeHouseMenu implements Menu {
ArrayList menuItems;
public PancakeHouseMenu() {
menuItems = new ArrayList();
addItem("牛肉煎饼", "加盐牛肉煎饼", true, 33);
addItem("鸡蛋煎饼", "加糖鸡蛋煎饼", false, 22);
}
public void addItem(String name, String description, boolean vegetarian, double price) {
MenuItem menuItem = new MenuItem(name, description, vegetarian, price);
menuItems.add(menuItem);
}
public ArrayList getMenuItems() {
return menuItems;
}
public Iterator createIterator() {
return menuItems.iterator();
}
}
/**
*
* @author feizhou 描述:菜单项
*/
public class MenuItem {
/**
* 菜单名
*/
String name;
/**
* 描述
*/
String description;
/**
* 是否素菜
*/
boolean vegetarian;
/**
* 价格
*/
double price;
public MenuItem(String name, String description, boolean vegetarian, double price) {
this.name = name;
this.description = description;
this.vegetarian = vegetarian;
this.price = price;
}
public String getName() {
return name;
}
public String getDescription() {
return description;
}
public double getPrice() {
return price;
}
public boolean isVegetarian() {
return vegetarian;
}
}
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("煎饼-----------");
printMenu(pancakeIterator);
System.out.println("\n 午餐-----------");
printMenu(dinerIterator);
}
private void printMenu(Iterator iterator) {
while (iterator.hasNext()) {
MenuItem menuItem = (MenuItem)iterator.next();
System.out.print(menuItem.getName() + ", ");
System.out.print(menuItem.getPrice() + " -- ");
System.out.println(menuItem.getDescription());
}
}
}
测试
public static void main(String args[]) {
PancakeHouseMenu pancakeHouseMenu = new PancakeHouseMenu();
DinerMenu dinerMenu = new DinerMenu();
Waitress waitress = new Waitress(pancakeHouseMenu, dinerMenu);
waitress.printMenu();
}
}
结果:
煎饼-----------
牛肉煎饼, 33.0 -- 加盐牛肉煎饼
鸡蛋煎饼, 22.0 -- 加糖鸡蛋煎饼
午餐-----------
牛肉饭, 44.0 -- 牛肉饭加青菜
港式下午茶, 55.0 -- 加糖港式下午茶