15 行为模式 - 迭代子(Iterator)模式

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

猜你喜欢

转载自samsongbest.iteye.com/blog/1631186