迭代器模式

迭代器模式

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 -- 加糖港式下午茶