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