个人笔记,请不要被误导。
迭代器模式:提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。
java中很多集合类实现了iterator接口,其中的remove()方法可以删除next()方法返回的最后一个元素。数组不支持iterator()方法,下面的代码写了一个自定义的数组迭代器。
迭代器分为内部迭代器和外部迭代器。内部迭代器,客户无法控制遍历的过程,不如外部迭代器有弹性。还有一个迭代器接口ListIterator,加了previous()方法,可以向前遍历。
这里提到一个原则:一个类应该只有一个引起变化的原因。
public class MenuItem {
public String name;
public boolean vegetaration;
public MenuItem(String name,boolean vegetaration){
this.name = name;
this.vegetaration = vegetaration;
}
public String getName() {
return name;
}
public boolean isVegetaration() {
return vegetaration;
}
}
public interface Menu {
public Iterator createIterator();
public void addItem(String name,boolean isVegeration);
}
public class DinerMenu implements Menu {
MenuItem[] menuItems;
@Override
public Iterator createIterator() {
return new DinerMenuIterator(menuItems);
}
@Override
public void addItem(String name, boolean isVegeration) {}
}
public class PancakeMenu implements Menu {
List<MenuItem> menuItems;
@Override
public Iterator createIterator() {
return menuItems.iterator();
}
@Override
public void addItem(String name, boolean isVegeration) {
MenuItem menuItem = new MenuItem(name,isVegeration);
menuItems.add(menuItem);
}
}
public class DinerMenuIterator implements Iterator {
MenuItem[] items;
int pos = 0;
public DinerMenuIterator(MenuItem[] menuItems){
items = menuItems;
}
@Override
public boolean hasNext() {
if (pos < items.length && items[pos + 1] != null) return true;
return false;
}
@Override
public Object next() {
return items[pos++];
}
}