1.用意
迭代子模式又叫游标模式,可以顺序地访问一个聚集中的元素而不必暴露聚集的内部表象。
2.类图
白箱聚集与外禀迭代子
黑箱聚集与内禀迭代子
3.代码
白箱聚集与外禀迭代子
/* * 抽象聚集角色 */ public abstract class Aggregate { public Iterator createIterator() { return null; } } /* * 具体聚集角色 */ public class ConcreteAggregate extends Aggregate { private Object[] objs = { "Monk Tang", "Monkey", "Pigsy", "Sandy", "Horse" }; public Iterator createIterator() { return new ConcreteIterator(this); } public Object getElement(int index) { if (index < objs.length) { return objs[index]; } else { return null; } } public int size() { return objs.length; } } /* * 抽象迭代子角色 */ public interface Iterator { void first(); void next(); boolean isDone(); Object currentItem(); } /* * 具体迭代子角色 */ public class ConcreteIterator implements Iterator { private ConcreteAggregate agg; private int index = 0; private int size = 0; public ConcreteIterator(ConcreteAggregate agg) { this.agg = agg; size = agg.size(); index = 0; } /* * 移动到第一个元素 * @see com.javapatterns.iterator.whitebox.Iterator#first() */ public void first() { index = 0; } /* * 移动到下一个元素 * @see com.javapatterns.iterator.whitebox.Iterator#next() */ public void next() { if (index < size) { index++; } } /* * 是否是第一个元素 * @see com.javapatterns.iterator.whitebox.Iterator#isDone() */ public boolean isDone() { return (index >= size); } /* * 返还当前元素 * @see com.javapatterns.iterator.whitebox.Iterator#currentItem() */ public Object currentItem() { return agg.getElement(index); } } /* * 测试类 */ public class Test { public static void main(String[] args) { ConcreteAggregate agg = new ConcreteAggregate(); Iterator ite = agg.createIterator(); for (int i = 0; i < agg.size(); i++) { S.s(ite.currentItem()); ite.next(); } } }
输出:
黑箱聚集与内禀迭代子
/* * 抽象聚集角色 */ public abstract class Aggregate { public abstract Iterator createIterator(); } /* * 具体聚集角色 */ public class ConcreteAggregate extends Aggregate { private Object[] objs = { "Monk Tang", "Monkey", "Pigsy", "Sandy", "Horse" }; public Iterator createIterator() { return new ConcreteIterator(); } /* * 具体迭代子角色 */ private class ConcreteIterator implements Iterator { private int currentIndex = 0; /* * 移动到第一个元素 * @see com.javapatterns.iterator.whitebox.Iterator#first() */ public void first() { currentIndex = 0; } /* * 移动到下一个元素 * @see com.javapatterns.iterator.whitebox.Iterator#next() */ public void next() { if (currentIndex < objs.length) { currentIndex++; } } /* * 是否是最后一个元素 * @see com.javapatterns.iterator.whitebox.Iterator#isDone() */ public boolean isDone() { return (currentIndex == objs.length); } /* * 返还当前元素 * @see com.javapatterns.iterator.whitebox.Iterator#currentItem() */ public Object currentItem() { return objs[currentIndex]; } } } /* * 抽象迭代子角色 */ public interface Iterator { void first(); void next(); boolean isDone(); Object currentItem(); } /* * 测试类 */ public class Test { private Iterator it; private Aggregate agg = new ConcreteAggregate(); public void operation() { it = agg.createIterator(); while (!it.isDone()) { S.s(it.currentItem().toString()); it.next(); } } public static void main(String[] args) { Test test = new Test(); test.operation(); } }
z