迭代器這個名詞對于熟悉Java的人來說絕對不陌生。我們常常使用JDK提供的迭代接口進(jìn)行java collection的遍歷:
Iterator it = list.iterator();
while(it.hasNext()){
Object obj = it.next();
......
}
其實(shí)這就是在Java語言中完美的迭代器模式:提供一種方法順序訪問一個聚合對象中各個元素, 而又不需暴露該對象的內(nèi)部表示。
Provide a way to access the elements of an aggregate object sequentially without exposing its underlying representation.
我們來看一下迭代器模式的UML類圖:

迭代器模式
- 迭代器角色(Iterator):迭代器角色負(fù)責(zé)定義訪問和遍歷元素的接口。
- 具體迭代器角色(Concrete Iterator):具體迭代器角色要實(shí)現(xiàn)迭代器接口,并要記錄遍歷中的當(dāng)前位置。
- 容器角色(Container):容器角色負(fù)責(zé)提供創(chuàng)建具體迭代器角色的接口。
- 具體容器角色(Concrete Container):具體容器角色實(shí)現(xiàn)創(chuàng)建具體迭代器角色的接口——這個具體迭代器角色于該容器的結(jié)構(gòu)相關(guān)。
一般在Java中,我們有很多集合類來代表Aggregate角色,如ArrayList、LinkedList等,而這些集合類已經(jīng)實(shí)現(xiàn)了Iterator接口。
總地來說,迭代器模式就是分離了集合對象的迭代行為,抽象出一個迭代器類來負(fù)責(zé),這樣既可做到不暴露集合的內(nèi)部結(jié)構(gòu),又可以讓外部代碼可以透明的訪問集合內(nèi)部的元素。迭代器模式在訪問數(shù)組、集合、列表等數(shù)據(jù)時,尤其是數(shù)據(jù)庫數(shù)據(jù)操作時,是非常普遍的應(yīng)用,但由于它太普遍了,所以各種高級語言都對他進(jìn)行了封裝,所以反而給人感覺此模式本身不太常用了。今天我們就不在這個上面再花時間進(jìn)行代碼的編寫,大家有興趣可以直接看一下JDK中相關(guān)的代碼,能夠?qū)W到很多。
加油!