设计模式学习笔记(十三)—Iterator迭代器模式
Iterator模式定义:
提供一个方法顺序访问一个聚合对象的各个元素,而又不暴露该对象的内部表示。
这个模式在java的类库中已经实现了,在java中所有的集合类都实现了Conllection接口,而Conllection接口又继承了Iterable接口,该接口有一个iterator方法,也就是所以的集合类都可以通过这个iterator方法来转换成Iterator类,用Iterator对象中的hasnext方法来判断是否还有下个元素,next方法来顺序获取集合类中的对象。今天面试考到设计模式,我愣是没答上来,我晕死,自己这几天刚学的东西,自己也都理解,可一到考试的时候不是忘了就是回答的不准确,自己也不清楚到底是为什么,哎,伤心。。。。。。,下面是Iterator模式的结构图:
在这个结构图中的Aggregate抽象类也可以定义成接口。下面给出一个例子来说明Iterator模式的使用。
import java.util.ArrayList;interface Iterator<E>{ public void first(); public void next(); public E currentItem(); public boolean isDone();}class ConcreteIterator<E> implements Iterator<E>{ private ConcreteAggregate<E> agg; private int index=0; private int size=0; public ConcreteIterator( ConcreteAggregate<E> aggregate) { this.agg=aggregate; this.index=0; this.size=aggregate.size(); } public E currentItem() { return agg.getElement(index); } public void first() { index=0; } public boolean isDone() { if(index>=size){ return true; } return false; } public void next() { if(index<size){ index++; } }}abstract class Aggregate<E>{ protected abstract Iterator createIterator();}class ConcreteAggregate<E> extends Aggregate<E>{ private ArrayList<E> arrayList=new ArrayList<E>(); public Iterator createIterator() { return new ConcreteIterator<E>(this); } public void add(E o){ arrayList.add(o); } public E getElement(int index) { if (index<arrayList.size()) { return arrayList.get(index); } else { return null; } } public int size(){ return arrayList.size(); }}public class Client { public static void main(String[] args) { ConcreteAggregate<String> aggregate=new ConcreteAggregate<String>(); aggregate.add("A"); aggregate.add("B"); aggregate.add("C"); aggregate.add("D"); aggregate.add("E"); Iterator iterator=aggregate.createIterator(); for(iterator.first();!iterator.isDone();iterator.next()){ System.out.println(iterator.currentItem()); } }}