前言
Android的設(shè)計模式系列文章介紹报慕,歡迎關(guān)注,持續(xù)更新中:
Android的設(shè)計模式-設(shè)計模式的六大原則
一句話總結(jié)23種設(shè)計模式則
創(chuàng)建型模式:
Android的設(shè)計模式-單例模式
Android的設(shè)計模式-建造者模式
Android的設(shè)計模式-工廠方法模式
Android的設(shè)計模式-簡單工廠模式
Android的設(shè)計模式-抽象工廠模式
Android的設(shè)計模式-原型模式
行為型模式:
Android的設(shè)計模式-策略模式
Android的設(shè)計模式-狀態(tài)模式
Android的設(shè)計模式-責任鏈模式
Android的設(shè)計模式-觀察者模式
Android的設(shè)計模式-模板方法模式
Android的設(shè)計模式-迭代器模式
Android的設(shè)計模式-備忘錄模式
Android的設(shè)計模式-訪問者模式
Android的設(shè)計模式-中介者模式
Android的設(shè)計模式-解釋器模式
Android的設(shè)計模式-命令模式
結(jié)構(gòu)型模式:
Android的設(shè)計模式-代理模式
Android的設(shè)計模式-組合模式
Android的設(shè)計模式-適配器模式
Android的設(shè)計模式-裝飾者模式
Android的設(shè)計模式-享元模式
Android的設(shè)計模式-外觀模式
Android的設(shè)計模式-橋接模式
1.定義
提供一種方法訪問一個容器對象中各個元素瓷叫,而又不需暴露該對象的內(nèi)部細節(jié)。
2.介紹
- 迭代器模式屬于行為型模式钞支。
- 迭代器(Iterator)模式郊楣,又叫做游標(Cursor)模式。
- Java中的Map摔刁、List等等容器挥转,都使用到了迭代器模式。
3.UML類圖
角色說明:
- Iterator(迭代器接口):負責定義共屈、訪問和遍歷元素的接口绑谣。
- ConcreteIterator(具體迭代器類):實現(xiàn)迭代器接口。
- Aggregate(容器接口):定義容器的基本功能以及提供創(chuàng)建迭代器的接口拗引。
- ConcreteAggregate(具體容器類):實現(xiàn)容器接口中的功能借宵。
- Client(客戶端類):即要使用迭代器模式的地方。
4.實現(xiàn)
繼續(xù)以快遞舉例子矾削,貨架上有很多快遞包壤玫,取快遞時我們報出手機號,然后快遞小哥就遍歷貨架上所有的快遞信息哼凯,直到找出快遞包為止:
4.1 創(chuàng)建迭代器接口
public interface Iterator {
boolean hasNext(); //是否存在下一條記錄
Object next(); //返回當前記錄并移到下一條記錄
}
4.2 創(chuàng)建容器接口
定義容器的基本功能以及提供創(chuàng)建迭代器的接口:
public interface Aggregate {
int size();//容器大小
String get(int location);//獲取獲取中指定位置的號碼
void add(String tel);//添加號碼到容器中
void remove(String tel);//從容器中移除號碼
Iterator iterator();//返回容器的迭代器
}
4.3 創(chuàng)建具體迭代器類
實現(xiàn)迭代器接口:
//快遞迭代類
public class DeliveryIterator implements Iterator {
private Aggregate aggregate;//容器對象
private int index;//當前索引
public DeliveryIterator(Aggregate aggregate) {
this.aggregate = aggregate;//初始化容器對象
}
@Override
public boolean hasNext() {//是否存在下一條記錄
if (index < aggregate.size()) {
return true;
} else {
return false;
}
}
@Override
public Object next() {//返回當前記錄并移到下一條記錄
return aggregate.get(index++);
}
}
4.4 創(chuàng)建具體容器類
實現(xiàn)容器接口中的功能:
//快遞容器類
public class DeliveryAggregate implements Aggregate {
private List<String> list = new ArrayList<>();//內(nèi)部使用list來存儲數(shù)據(jù)
public int size() {//容器大小
return list.size();
}
public String get(int location) {
return list.get(location);
}
public void add(String tel) {
list.add(tel);
}
public void remove(String tel) {
list.remove(tel);
}
@Override
public Iterator iterator() {////返回迭代器
return new DeliveryIterator(this);
}
}
4.5 客戶端測試
public void test() {
Aggregate aggregate=new DeliveryAggregate();
aggregate.add("1111");
aggregate.add("2222");
aggregate.add("3333");
aggregate.add("9527");
Iterator iterator = aggregate.iterator();
while (iterator.hasNext()){
String tel = (String) iterator.next();
System.out.println("當前號碼為:"+tel);
}
System.out.println("后面沒有了");
}
輸出結(jié)果:
當前號碼為:1111
當前號碼為:2222
當前號碼為:3333
當前號碼為:9527
后面沒有了
5. 應(yīng)用場景
- 遍歷一個容器對象時欲间。
- 實際我們開發(fā)中很少使用到迭代器模式。雖然不怎么用得到断部,但是了解其原理能夠讓我們在看到相關(guān)的源碼(如Java中的Map括改、List等等容器)時能夠更容易了解源碼的相關(guān)思想。
6. 優(yōu)點
- 可以支持以不同的方式去遍歷容器對象家坎,如順序遍歷,逆序遍歷等等吝梅。
- 符合單一職責原則虱疏,容器類與遍歷算法的分離,不同類負責不同的功能苏携。
7. 缺點
- 會產(chǎn)生多余的對象做瞪,消耗內(nèi)存。
- 會增多類文件。
- 遍歷過程是一個單向且不可逆的遍歷装蓬。
- 遍歷過程需要注意容器是否改變著拭,若期間改變了,可能會拋出異常牍帚。
8. Android中的源碼分析
除了Java中的Map儡遮、List等有用到迭代器模式之外,Android中使用數(shù)據(jù)庫查詢時返回的Cursor游標對象暗赶,實際上就是使用了迭代器模式來實現(xiàn)鄙币,首先先讓我們來看下怎么使用Cursor:
8.1 使用Cursor
Cursor cursor = sqLiteDatabase.query("table", null, null, null, null, null, null);//各種參數(shù)請自行查詢用法,這里就不說明了
if (cursor.moveToFirst()) {//游標指向第一行
do {
cursor.getInt(0);//獲得第一列數(shù)據(jù)
cursor.getString(1);//獲得第二列數(shù)據(jù)
} while (cursor.moveToNext());//移到下一行
}
8.2 Cursor源碼
//Cursor是一個接口蹂随,實際上就是迭代器接口
public interface Cursor extends Closeable {
//其他代碼略
boolean moveToFirst();
int getInt(int columnIndex);
String getString(int columnIndex);
boolean moveToNext();
}
從上面代碼可以看出Cursor游標實際上就是個迭代器十嘿。
8.3 其他
有興趣的可以去看下Java中的Map、List等的源碼岳锁,那個更直觀簡單绩衷。
相關(guān)文章閱讀
Android的設(shè)計模式-設(shè)計模式的六大原則
一句話總結(jié)23種設(shè)計模式則
創(chuàng)建型模式:
Android的設(shè)計模式-單例模式
Android的設(shè)計模式-建造者模式
Android的設(shè)計模式-工廠方法模式
Android的設(shè)計模式-簡單工廠模式
Android的設(shè)計模式-抽象工廠模式
Android的設(shè)計模式-原型模式
行為型模式:
Android的設(shè)計模式-策略模式
Android的設(shè)計模式-狀態(tài)模式
Android的設(shè)計模式-責任鏈模式
Android的設(shè)計模式-觀察者模式
Android的設(shè)計模式-模板方法模式
Android的設(shè)計模式-迭代器模式
Android的設(shè)計模式-備忘錄模式
Android的設(shè)計模式-訪問者模式
Android的設(shè)計模式-中介者模式
Android的設(shè)計模式-解釋器模式
Android的設(shè)計模式-命令模式
結(jié)構(gòu)型模式:
Android的設(shè)計模式-代理模式
Android的設(shè)計模式-組合模式
Android的設(shè)計模式-適配器模式
Android的設(shè)計模式-裝飾者模式
Android的設(shè)計模式-享元模式
Android的設(shè)計模式-外觀模式
Android的設(shè)計模式-橋接模式