1缀踪、迭代器模式概念
1.1 介紹
迭代器模式(Iterator Pattern)又稱為游標(biāo)(Cursor)模式罢吃,是行為型設(shè)計(jì)模式之一娃圆。
源于對(duì)容器的訪問褪储,比如java中的list疗韵,Map,數(shù)組等李命,我們知道對(duì)容器對(duì)象的訪問必然是多種多樣的登淘,所以我們把遍歷的方法封裝在容器中,或者不提供遍歷方法封字。
1.2 定義
提供一種方法順序訪問一個(gè)容器對(duì)象中的各個(gè)元素黔州,而又不需要暴露該對(duì)象的內(nèi)部表示。
1.3 使用場景
訪問一個(gè)聚合對(duì)象的內(nèi)容而無需暴露它的內(nèi)部表示
支持對(duì)聚合對(duì)象的多種遍歷
為遍歷不同的聚合結(jié)構(gòu)提供一個(gè)統(tǒng)一的接口
2周叮、迭代器模式UML類圖
角色如下:
Iterator(迭代器):迭代器定義訪問和遍歷元素的接口
ConcreteIterator (具體迭代器):具體迭代器實(shí)現(xiàn)迭代器接口辩撑,對(duì)該聚合遍歷時(shí)跟蹤當(dāng)前位置
Aggregate (聚合):聚合定義創(chuàng)建相應(yīng)迭代器對(duì)象的接口
ConcreteAggregate (具體聚合):具體聚合實(shí)現(xiàn)創(chuàng)建相應(yīng)迭代器的接口界斜,該操作返回ConcreteIterator的一個(gè)適當(dāng)?shù)膶?shí)例
3仿耽、迭代器模式實(shí)現(xiàn)
Iterator:
/**
*抽象迭代接口
*/
public interface Iterator <T>{
/**
* 是否有下一元素
* @return
*/
boolean hasNext();
T next();
}
ConcreteItertor:
/**
* 具體的迭代角色
*/
public class ConcreteItertor<T> implements Iterator<T>{
public ConcreteItertor(List<T> list) {
this.list = list;
}
private List<T> list = new ArrayList<>();
private int cursor = 0;
@Override
public boolean hasNext() {
return cursor!=list.size();
}
@Override
public T next() {
T obj = null;
if(this.hasNext()){
obj = list.get(cursor++);
}
return obj;
}
}
Aggregate:
/**
* 容器的接口
*/
public interface Aggregate<T> {
void add(T t);
void remove(T t);
Iterator<T> iterator();
}
ConcreteAggregate:
public class ConcreteAggregate<T> implements Aggregate<T> {
private List<T> list = new ArrayList<>();
@Override
public void add(T t) {
list.add(t);
}
@Override
public void remove(T t) {
list.remove(t);
}
@Override
public Iterator<T> iterator() {
return new ConcreteItertor<>(list);
}
}
Client:
public class Client {
public static void main(String[] args){
//實(shí)例化容器類對(duì)象
Aggregate<String> aggregate = new ConcreteAggregate<>();
aggregate.add("aaaa");
aggregate.add("bbbb");
aggregate.add("cccc");
Iterator<String> iterator = aggregate.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
}
}
結(jié)果輸出:
aaaa
bbbb
cccc
4、Android源碼中的模式實(shí)現(xiàn)
1.除了各種數(shù)據(jù)結(jié)構(gòu)體各薇,如List,Map等包含的迭代器外
2.Android自身源碼中也為我們提供了迭代器遍歷數(shù)據(jù)项贺,最為典型的例子就是數(shù)據(jù)庫查詢使用Cursor(當(dāng)我們使用SQLiteDatabase的query方法查詢數(shù)據(jù)庫時(shí)返回的)君躺,該游標(biāo)對(duì)象實(shí)質(zhì)就是一個(gè)具體的迭代器,我們可以使用它來遍歷數(shù)據(jù)庫查詢所得的結(jié)果集
5开缎、模式總結(jié)
5.1 優(yōu)點(diǎn)
- 它支持以不同的方式遍歷一個(gè)聚合對(duì)象棕叫。
- 迭代器簡化了聚合類。
- 在同一個(gè)聚合上可以有多個(gè)遍歷奕删。
- 在迭代器模式中俺泣,增加新的聚合類和迭代器類都很方便,無須修改原有代碼完残。
5.2 缺點(diǎn)
- 由于迭代器模式將存儲(chǔ)數(shù)據(jù)和遍歷數(shù)據(jù)的職責(zé)分離伏钠,增加新的聚合類需要對(duì)應(yīng)增加新的迭代器類,類的個(gè)數(shù)成對(duì)增加谨设,這在一定程度上增加了系統(tǒng)的復(fù)雜性熟掂。