介紹
迭代器模式(Iterator Pattern) 又稱(chēng)游標(biāo)(Cursor) 模式,是行為型設(shè)計(jì)模式之一。迭代器模式源于對(duì)容器的訪問(wèn),比如 Java 中的 List、Map、數(shù)組等,我們知道對(duì)容器對(duì)象的訪問(wèn)必然會(huì)涉及到遍歷算法,我們可以將遍歷的方法封裝在容器中,或者不提供便利方法。如果我們將便利方法封裝在容器中,那么對(duì)于容器來(lái)說(shuō)承擔(dān)了過(guò)多的功能,容器類(lèi)不僅要維護(hù)自身內(nèi)部的數(shù)據(jù)元素而且還要對(duì)外提供遍歷的接口方法,因?yàn)楸闅v狀態(tài)的存儲(chǔ)問(wèn)題還不能對(duì)同一個(gè)容器同時(shí)進(jìn)行多個(gè)便利操作,如果我們不提供便利方法而讓使用者自己去實(shí)現(xiàn),又會(huì)讓容器內(nèi)部細(xì)節(jié)暴露,因此,迭代器模式產(chǎn)生,在客戶(hù)訪問(wèn)類(lèi)與容器之間插入了一個(gè)第三者 - 迭代器,很好的解決了上述的弊端。
定義
提供一種方法順序訪問(wèn)一個(gè)容器對(duì)象中的各個(gè)元素,而又不需要暴露該對(duì)象的內(nèi)部表示。
使用場(chǎng)景
遍歷一個(gè)容器對(duì)象時(shí)
角色介紹
Iterator 迭代器接口,負(fù)責(zé)定義訪問(wèn)和遍歷元素的接口,有 hasNext 和 next 兩個(gè)抽象方法
ConcreteIterator 具體迭代器類(lèi),主要實(shí)現(xiàn)迭代器接口,并記錄遍歷的當(dāng)前位置
Aggregate 容器接口,負(fù)責(zé) 提供 創(chuàng)建具體迭代器角色的接口
ConcreteAggregate 具體容器類(lèi),實(shí)現(xiàn)創(chuàng)建迭代器角色的接口,創(chuàng)建具體的迭代器與該容器相關(guān)聯(lián)
Client 客戶(hù)端類(lèi)
public interface Iterator<E> {
boolean hasNext();
E next();
}
public Interface Aggregate<E> {
Iterator<E> iterator;
}
使用泛型,這樣在列表中放入的元素確定之后,可以在放入非該類(lèi)型元素的時(shí)候編譯不通過(guò),而不是非要運(yùn)行期才發(fā)現(xiàn)錯(cuò)誤
Android 源碼中的迭代器模式
典型的例子就是數(shù)據(jù)庫(kù)查詢(xún)使用的 Cursor,該游標(biāo)對(duì)象的實(shí)質(zhì)就是一個(gè)具體的迭代器
優(yōu)點(diǎn)
支持以不同的方式去遍歷一個(gè)容器對(duì)象,也可以有多個(gè)遍歷,弱化了容器類(lèi)與遍歷算法直接的關(guān)系
缺點(diǎn)
類(lèi)文件的增加