迭代器模式(Iterator):提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露对象的内部表示。
- 白话:java中的iterator就是这样的模型,聚合对象不暴露自己内部的数据组合,而是将遍历任务交给iterator,iterator固定提供几个遍历用到的方法给client。
- 角色:(1)聚合类:被迭代器访问的聚合类;
(2)迭代器:遍历聚合类的操作类;
注:迭代器提供的方法:
First()------聚合类中的遍历的第一个元素;这里不一定是聚合类的第一个元素;这里有点绕;举个例子:比如聚合类存放的是一个数组;而遍历的却是从最后往前的,则First()则是最后一个元素;因此First()跟遍历的具体实现有关;
Next()------遍历时的下一个元素;
IsDone()----遍历是否结束;
CurrentItem()-----遍历时当前的元素;
- 使用场景:对一个聚合的所有元素进行遍历时,考虑迭代器模式。
- 示例:
迭代类:
聚合类:interface Iterator<T> { public T first(); public T next(); public boolean isDone(); public T currentItem(); }
测试类:class MilkBox { private List<Milk> milks = new ArrayList<Milk>(); public enum IteratorType { MilkIterator, MilkIteratorDec; } private class Milk { private String name; public Milk(String name) { super(); this.name = name; } } public void putMilk(String name) { Milk milk = new Milk(name); milks.add(milk); } public Iterator<String> iterator(IteratorType type) { switch (type) { case MilkIterator: return new MilkIterator(); case MilkIteratorDec: return new MilkIteratorDec(); default: break; } return null; } class MilkIterator implements Iterator<String> { private int current; @Override public String first() { current = 0; return currentItem(); } @Override public String next() { String ret = null; current++; if (!isDone()) { ret = milks.get(current).name; } return ret; } @Override public boolean isDone() { return current >= milks.size(); } @Override public String currentItem() { return milks.get(current).name; } } class MilkIteratorDec implements Iterator<String> { private int current; @Override public String first() { current = milks.size() - 1; if (current > 0) return currentItem(); else return null; } @Override public String next() { String ret = null; current--; if (!isDone()) { ret = milks.get(current).name; } return ret; } @Override public boolean isDone() { return current < 0; } @Override public String currentItem() { return milks.get(current).name; } }
public class IteratorTest { public static void main(String[] args) { MilkBox milkBox = new MilkBox(); milkBox.putMilk("蒙牛"); milkBox.putMilk("伊利"); milkBox.putMilk("特仑苏"); milkBox.putMilk("六个核桃"); Iterator<String> iterator = milkBox.iterator(IteratorType.MilkIterator); for (iterator.first(); !iterator.isDone(); iterator.next()) { System.out.println("" + iterator.currentItem()); } System.out.println(); iterator = milkBox.iterator(IteratorType.MilkIteratorDec); for (iterator.first(); !iterator.isDone(); iterator.next()) { System.out.println("" + iterator.currentItem()); } } }
output:
注:(1)对于客户端(测试类)而言,milk这个类是透明的(不可见的),而milkbox是如何组合这些数据也是透明的(即milkbox用的list还是数组或其他数据结构,客户端是不可见的)。
(2)迭代类存在两种,正向迭代和逆向迭代,当然也可以定制化自己的迭代。