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