Posted on 2007-12-04 23:52
flustar 閱讀(3228)
評論(1) 編輯 收藏 所屬分類:
Design Patterns
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());
}
}
}
輸出結果:
A
B
C
D
E
在這個例子中,我們按照Iterator模式的結構圖來創建的例子,我們創建的集合ConcreteAggregate可以存放任何類型的數據,然后使用createIterator方法轉換成Iterator對象,使用Iterator對象來按順序顯示集合中的內容。這個模式在Java的jdk中是這樣實現的,所以的集合類都實現了Iterable接口,這個接口中有一個iterator方法可以把集合類的對象轉換成Iterator類的對象。明白這個原理可以更好的理解Java中的集合類和迭代器,根據這個可以創建功能更加強大的集合類。
小結:Iterator模式主要用在當一個集合類中的元素經常變動時,而不需要改變客戶端的代碼。