图片来自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; } @Override public boolean hasNext() { if (pos>=menuItems.length||menuItems[pos]==null)return false; else return true; } @Override public 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()); } } }