1.迭代器模式的定義及使用場(chǎng)景
定義:
迭代器模式又稱(chēng)游標(biāo)模式,是行為型設(shè)計(jì)模式之一。其源于對(duì)容器的訪問(wèn),比較java的List、Map、數(shù)組等。如果將容器遍歷的方法封裝在容器中,容器類(lèi)不僅要維護(hù)自身內(nèi)部的數(shù)據(jù)元素而且還要對(duì)外提供遍歷的接口方法,如果不提供遍歷的方法而讓使用者自己去實(shí)現(xiàn),又會(huì)讓容器的內(nèi)部細(xì)節(jié)暴露。正因于此,迭代模式應(yīng)運(yùn)而生。迭代器模式提供一種方法順序訪問(wèn)一個(gè)容器對(duì)象的各個(gè)元素,而又不需要暴露該對(duì)象的內(nèi)部表示
使用場(chǎng)景:
遍歷一個(gè)容器對(duì)象重點(diǎn)內(nèi)容

2. 迭代器模式的優(yōu)缺點(diǎn)
2.1優(yōu)點(diǎn)
可以遍歷容器而又不暴露該對(duì)象的內(nèi)部表示,弱化了容器類(lèi)和遍歷算法之間的關(guān)系
2.2缺點(diǎn)
增加類(lèi)文件
3.注意事項(xiàng)
3.1使用for循環(huán)與使用迭代器iterator的對(duì)比
效率上的各有有事采用ArrayList對(duì)隨機(jī)訪問(wèn)比較快,而for循環(huán)中的get()方法,采用的即是隨機(jī)訪問(wèn)的方法,因此在ArrayList里,for循環(huán)較快采用LinkedList則是順序訪問(wèn)比較快,iterator中的next()方法,采用的即是順序訪問(wèn)的方法,因此在LinkedList里,使用iterator較快從數(shù)據(jù)結(jié)構(gòu)角度分析,for循環(huán)適合訪問(wèn)順序結(jié)構(gòu),可以根據(jù)下標(biāo)快速獲取指定元素.而Iterator 適合訪問(wèn)鏈?zhǔn)浇Y(jié)構(gòu),因?yàn)榈魇峭ㄟ^(guò)next()和Pre()來(lái)定位的.可以訪問(wèn)沒(méi)有順序的集合.
而使用 Iterator 的好處在于可以使用相同方式去遍歷集合中元素,而不用考慮集合類(lèi)的內(nèi)部實(shí)現(xiàn)(只要它實(shí)現(xiàn)了 java.lang.Iterable 接口),如果使用 Iterator 來(lái)遍歷集合中元素,一旦不再使用 List 轉(zhuǎn)而使用 Set 來(lái)組織數(shù)據(jù),那遍歷元素的代碼不用做任何修改,如果使用 for 來(lái)遍歷,那所有遍歷此集合的算法都得做相應(yīng)調(diào)整,因?yàn)長(zhǎng)ist有序,Set無(wú)序,結(jié)構(gòu)不同,他們的訪問(wèn)算法也不一樣.
3.2foreach和Iterator的關(guān)系
for each是jdk5.0新增加的一個(gè)循環(huán)結(jié)構(gòu),可以用來(lái)處理集合中的每個(gè)元素而不用考慮集合定下標(biāo)。格式如下for(variable:collection){ statement; }定義一個(gè)變量用于暫存集合中的每一個(gè)元素,并執(zhí)行相應(yīng)的語(yǔ)句(塊)。collection必須是一個(gè)數(shù)組或者是一個(gè)實(shí)現(xiàn)了lterable接口的類(lèi)對(duì)象。 使用for each循環(huán)語(yǔ)句的優(yōu)勢(shì)在于更加簡(jiǎn)潔,更不容易出錯(cuò),不必關(guān)心下標(biāo)的起始值和終止值
4.迭代器模式的實(shí)現(xiàn)方式
public interface Iterator {
public Object next();
public boolean hasNext();
public boolean remove();
}```
public class ConcreteIteractor implements Iterator {
private Vector vevcor=new Vector<>();
private int curosr=0;
public ConcreteIteractor(Vector vevcor) {
this.vevcor = vevcor;
}
@Override
public Object next() {
Object result=null;
if(this.hasNext()){
result=this.vevcor.get(this.curosr++);
}else{
result=null;
}
return result;
}
@Override
public boolean hasNext() {
if(this.curosr==this.vevcor.size()){
curosr=0;
return false;
}else{
return true;
}
}
@Override
public boolean remove() {
this.vevcor.remove(this.curosr);
return true;
}
}```
public interface Aggregate {
public void add(Object object);
public void remove(Object remove);
public Iterator iterator();
}```
public class ConcreteAggragate implements Aggregate {
private Vector vevcor = new Vector<>();
@Override
public void add(Object object) {
this.vevcor.add(object);
}
@Override
public void remove(Object remove) {
this.vevcor.remove(remove);
}
@Override
public Iterator iterator() {
return new ConcreteIteractor(vevcor);
}
}```
5. 迭代器模式在Android中的實(shí)際應(yīng)用
迭代器這個(gè)模式對(duì)開(kāi)發(fā)者來(lái)說(shuō)幾乎不會(huì)自己去實(shí)現(xiàn)一個(gè)迭代器,Android中,其除了各種數(shù)據(jù)結(jié)構(gòu)體,如List、Map等所包含的迭代器外,Android自身源碼中也為我們提供了迭代器遍歷數(shù)據(jù)。最為典型的例子就是Cursor游標(biāo)對(duì)象,該游標(biāo)對(duì)象實(shí)質(zhì)就是一個(gè)具體的迭代器,我們可以使用它來(lái)遍歷數(shù)據(jù)庫(kù)查詢(xún)所得的結(jié)果集。
出處:http://huangjunbin.com/page/2/