读《研磨设计形式》-代码笔记-迭代器模式

读《研磨设计模式》-代码笔记-迭代器模式
声明:
本文只为方便我个人查阅和理解,详细的分析以及源代码请移步 原作者的博客http://chjavach.iteye.com/


import java.util.Arrays;
import java.util.List;

abstract class Aggregate {
	public abstract Iterator iterator();
}

class ArrayAggregate extends Aggregate {

	private String[] data;

	public ArrayAggregate(String[] data) {
		this.data = data;
	}

	@Override
	public Iterator iterator() {
		return new ArrayIterator(this);
	}

	public Object get(int index) {
		Object item = null;
		if (index < data.length) {
			item = data[index];
		}
		return item;
	}

	public int size() {
		return data.length;
	}
}

class ListAggregate extends Aggregate {

	private List<String> data;

	public ListAggregate(List<String> data) {
		this.data = data;
	}

	@Override
	public Iterator iterator() {
		return new ListIterator(this);
	}

	public int size() {
		return data.size();
	}

	public Object get(int index) {
		Object item = null;
		if (index < data.size()) {
			item = data.get(index);
		}
		return item;
	}
}

class ArrayIterator implements Iterator {

	private ArrayAggregate aggregate;

	private int index;

	public ArrayIterator(ArrayAggregate aggregate) {
		this.aggregate = aggregate;
	}

	public void first() {
		index = 0;
	}

	public void next() {
		if (index < aggregate.size()) {
			index++;
		}
	}

	public boolean isDone() {
		return index == aggregate.size();
	}

	public Object currItem() {
		return aggregate.get(index);
	}
}

class ListIterator implements Iterator {

	private ListAggregate aggregate;

	private int index;

	public ListIterator(ListAggregate aggregate) {
		this.aggregate = aggregate;
	}

	public void first() {
		index = 0;
	}

	public void next() {
		if (index < aggregate.size()) {
			index++;
		}
	}

	public boolean isDone() {
		return index == aggregate.size();
	}

	public Object currItem() {
		return aggregate.get(index);
	}

}

interface Iterator {
	void first();

	void next();

	boolean isDone();

	Object currItem();
}

public class IteratorPattern {

	public static void main(String[] args) {

		String[] array = { "aa", "bb", "cc" };
		ArrayAggregate aggregate2 = new ArrayAggregate(array);
		Iterator iterator2 = aggregate2.iterator();
		visit(iterator2);

		List<String> list = Arrays.asList(array); // asList返回的是一个不可修改的List,只供遍历
		ListAggregate aggregate = new ListAggregate(list);
		Iterator iterator = aggregate.iterator();
		visit(iterator);

	}

	public static void visit(Iterator iterator) {
		iterator.first();
		while (!iterator.isDone()) {
			Object obj = iterator.currItem();
			System.out.println(obj);
			iterator.next();
		}
	}
}