一柿隙、定義
提供一種方法順序訪問(wèn)一個(gè)容器對(duì)象中的各個(gè)元素,而又不需要暴露該對(duì)象的內(nèi)部表示鲫凶。
二禀崖、使用場(chǎng)景
遍歷一個(gè)容器對(duì)象時(shí)。
三螟炫、UML類(lèi)圖
Iterator:迭代器接口波附,負(fù)責(zé)定義、訪問(wèn)和遍歷元素的接口不恭。
ConcreteIterator:具體迭代器類(lèi)叶雹,實(shí)現(xiàn)迭代器接口,并記錄遍歷的當(dāng)前位置换吧。
Aggregate:容器接口折晦,負(fù)責(zé)提供創(chuàng)建具體迭代器角色的接口。
ConcreteAggregate:具體容器類(lèi)沾瓦,具體迭代器角色與該容器相關(guān)聯(lián)满着。
Client:客戶端。
四贯莺、實(shí)現(xiàn)
//抽象迭代器
public abstract class Iterator {
public abstract Object first();
public abstract Object next();
public abstract boolean isDone();
public abstract Object currentItem();
}
//抽象聚集類(lèi)
public abstract class Aggregate {
public abstract Iterator createIterator();
}
//具體迭代器
public class ConcreteIterator extends Iterator {
private ConcreteAggregate aggregate;
private int current = 0;
public ConcreteIterator(ConcreteAggregate aggregate) {
this.aggregate = aggregate;
}
@Override
public Object first() {
return aggregate.getItem(0);
}
@Override
public Object next() {
Object ret = null;
current++;
if(current < aggregate.count) {
ret = aggregate.getItem(current);
}
return ret;
}
@Override
public boolean isDone() {
return current >= aggregate.getCount() ? true : false;
}
@Override
public Object currentItem() {
return aggregate.getItem(current);
}
}
//具體聚集類(lèi)
public class ConcreteAggregate extends Aggregate {
private List<Object> items = new ArrayList<Object>();
@Override
public Iterator createIterator() {
return new ConcreteIterator(this);
}
public int getCount() {
return items.size();
}
public Object getItem(int index) {
return items[index];
}
public void setItem(int index, Object value) {
items.insert(index, value);
}
}
//客戶端
public class Client {
public static void main(String[] args) {
ConcreteAggregate a = new ConcreteAggregate();
a.setItem(0, "A");
a.setItem(1, "B");
a.setItem(2, "C");
a.setItem(3, "D");
a.setItem(4, "E");
a.setItem(5, "F");
Iterator i = new ConcreteIterator(a);
Object item = i.first();
while(!i.isDone()) {
System.out.println("current item: " + i.currentItem());
i.next();
}
}
}
備注:可以定義多個(gè)具體迭代器類(lèi)风喇,對(duì)聚集實(shí)現(xiàn)多種方式遍歷。
五缕探、應(yīng)用
對(duì)開(kāi)發(fā)者來(lái)說(shuō)幾乎不會(huì)自己去實(shí)現(xiàn)一個(gè)迭代器魂莫,就拿Android來(lái)說(shuō),其除了各種數(shù)據(jù)結(jié)構(gòu)體爹耗,如List耙考、Map等所包含的迭代器外,Android自身源碼中也為我們提供了迭代器遍歷數(shù)據(jù)潭兽,最為典型的例子就是數(shù)據(jù)庫(kù)查詢使用Cursor倦始,當(dāng)我們使用SQLiteDatabase的query方法查詢數(shù)據(jù)庫(kù)時(shí),會(huì)返回一個(gè)Cursor游標(biāo)對(duì)象山卦,該游標(biāo)對(duì)象實(shí)質(zhì)就是一個(gè)具體的迭代器鞋邑,我們可以使用它來(lái)遍歷數(shù)據(jù)庫(kù)查詢所得的結(jié)果集。
六账蓉、總結(jié)
迭代器模式就是分離了集合對(duì)象的遍歷行為枚碗,抽象出一個(gè)迭代器類(lèi)來(lái)負(fù)責(zé),這樣既可以做到不暴露集合的內(nèi)部結(jié)構(gòu)铸本,又可讓外部代碼透明地訪問(wèn)集合內(nèi)部的數(shù)據(jù)肮雨。