图片来自head first 设计模式,仅供学习之用
事实证明光看是没有用的,实践才能出真知,迭代器模式没有我想想的那么简单,写了个小例子才发现自己的理解并不深刻。例子是仿照head first的。迭代器是一个完整的类,作用是遍历集合对象。所以迭代器需要保存在集合中的位置信息,还需要保持对集合对象的一个引用,以便返回下一个集合元素。要运用迭代器,集合对象要能够产生对应的迭代器。凡是满足迭代器接口的都可以用迭代器遍历,但是不同集合的迭代器的实现是不同的,取决于设计 存放数据的数据结构
package com.company;public interface MyIterator {public boolean hasNext();public Object next(); } class MenuItem{private String name;private double price;public MenuItem(String name,double price){this.name=name;this.price=price;}public String getName() {return name;}public double getPrice() {return price;} } class MenuIterator implements MyIterator{private MenuItem[] menuItems;private int pos;public MenuIterator(MenuItem[]menuItems){this.menuItems=menuItems;pos=0;}@Overridepublic boolean hasNext() {if (pos>=menuItems.length||menuItems[pos]==null)return false;else return true;}@Overridepublic Object next() {MenuItem menuItem=menuItems[pos];pos++;return menuItem;} } //agregate class Menu{static final int MAX_ITEMS=100;private String menuName;private MenuItem[] menuItems;private int numOfItems;public Menu(){menuItems=new MenuItem[MAX_ITEMS];add(new MenuItem("青菜",2));add(new MenuItem("红烧肉",6));add(new MenuItem("番茄炒蛋",3.5));add(new MenuItem("牛肉",7));add(new MenuItem("包菜",1.5));}void add(MenuItem menuItem){if(numOfItems>=MAX_ITEMS){System.out.println("菜单满了");return;}menuItems[numOfItems]=menuItem;numOfItems++;}MyIterator getIterator(){return new MenuIterator(menuItems);} } class MyIteratorTest{public static void test(){Menu menu=new Menu();MyIterator myIterator=menu.getIterator();PrintMenu(myIterator);}static void PrintMenu(MyIterator myIterator){while (myIterator.hasNext()){MenuItem menuItem=(MenuItem)myIterator.next();System.out.println(menuItem.getName()+","+menuItem.getPrice());}} }