Iterator模式定義:
提供一個(gè)方法順序訪問一個(gè)聚合對(duì)象的各個(gè)元素,而又不暴露該對(duì)象的內(nèi)部表示。
這個(gè)模式在java的類庫中已經(jīng)實(shí)現(xiàn)了,在java中所有的集合類都實(shí)現(xiàn)了Conllection接口,而Conllection接口又繼承了Iterable接口,該接口有一個(gè)iterator方法,也就是所以的集合類都可以通過這個(gè)iterator方法來轉(zhuǎn)換成Iterator類,用Iterator對(duì)象中的hasnext方法來判斷是否還有下個(gè)元素,next方法來順序獲取集合類中的對(duì)象。今天面試考到設(shè)計(jì)模式,我愣是沒答上來,我暈死,自己這幾天剛學(xué)的東西,自己也都理解,可一到考試的時(shí)候不是忘了就是回答的不準(zhǔn)確,自己也不清楚到底是為什么,哎,傷心。。。。。。,下面是Iterator模式的結(jié)構(gòu)圖:

在這個(gè)結(jié)構(gòu)圖中的Aggregate抽象類也可以定義成接口。下面給出一個(gè)例子來說明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());
}
}
}
輸出結(jié)果:
A
B
C
D
E
在這個(gè)例子中,我們按照Iterator模式的結(jié)構(gòu)圖來創(chuàng)建的例子,我們創(chuàng)建的集合ConcreteAggregate可以存放任何類型的數(shù)據(jù),然后使用createIterator方法轉(zhuǎn)換成Iterator對(duì)象,使用Iterator對(duì)象來按順序顯示集合中的內(nèi)容。這個(gè)模式在Java的jdk中是這樣實(shí)現(xiàn)的,所以的集合類都實(shí)現(xiàn)了Iterable接口,這個(gè)接口中有一個(gè)iterator方法可以把集合類的對(duì)象轉(zhuǎn)換成Iterator類的對(duì)象。明白這個(gè)原理可以更好的理解Java中的集合類和迭代器,根據(jù)這個(gè)可以創(chuàng)建功能更加強(qiáng)大的集合類。
小結(jié):Iterator模式主要用在當(dāng)一個(gè)集合類中的元素經(jīng)常變動(dòng)時(shí),而不需要改變客戶端的代碼。