例如Waitress类要遍历打印两种菜单,一种是基于ArrayList,一种是基于数组;
则Waitress需要对他们分别用两个不同的逻辑来遍历。
Provide a way to access the elements of an aggregate object sequentially without exposing its underlying representation.
迭代器模式提供了一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。
这是所有迭代器都必须实现的接口,利用该接口方法可以在集合元素之间游走。可用java.util.Iterator
具体迭代器负责管理目前遍历的位置、完成集合元素的遍历。
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; } } }
是对具体集合类的抽象,方便客户端代码,将客户端代码从具体集合对象中解耦。——让客户端:针对接口编程,而不针对实现编程
实现createIterator(),返回一个ConcreteIterator对象;该迭代器对象能够遍历对象集合。
public class DinerMenu { MenuItem[] menuItems; //返回迭代器接口 public Iterator createIterator { return new DinerMenuIterator( menuItems ); } //这个方法不再需要,因为会暴露内部实现!! public MenuItem[] getMenuItem(){ return menuItems; } }
尽量不要自己写迭代器模式。使用Java提供的Iterator一般就足够了。
注:上例中是数组,所以自己写了个Iterator;如果是ArrayList则直接使用.iterator()即可!