前言
Android的設計模式系列文章介紹,歡迎關注,持續更新中:
Android的設計模式-設計模式的六大原則
一句話總結23種設計模式則
創建型模式:
Android的設計模式-單例模式
Android的設計模式-建造者模式
Android的設計模式-工廠方法模式
Android的設計模式-簡單工廠模式
Android的設計模式-抽象工廠模式
Android的設計模式-原型模式
行為型模式:
Android的設計模式-策略模式
Android的設計模式-狀態模式
Android的設計模式-責任鏈模式
Android的設計模式-觀察者模式
Android的設計模式-模板方法模式
Android的設計模式-迭代器模式
Android的設計模式-備忘錄模式
Android的設計模式-訪問者模式
Android的設計模式-中介者模式
Android的設計模式-解釋器模式
Android的設計模式-命令模式
結構型模式:
Android的設計模式-代理模式
Android的設計模式-組合模式
Android的設計模式-適配器模式
Android的設計模式-裝飾者模式
Android的設計模式-享元模式
Android的設計模式-外觀模式
Android的設計模式-橋接模式
1.定義
提供一種方法訪問一個容器對象中各個元素,而又不需暴露該對象的內部細節。
2.介紹
- 迭代器模式屬于行為型模式。
- 迭代器(Iterator)模式,又叫做游標(Cursor)模式。
- Java中的Map、List等等容器,都使用到了迭代器模式。
3.UML類圖
角色說明:
- Iterator(迭代器接口):負責定義、訪問和遍歷元素的接口。
- ConcreteIterator(具體迭代器類):實現迭代器接口。
- Aggregate(容器接口):定義容器的基本功能以及提供創建迭代器的接口。
- ConcreteAggregate(具體容器類):實現容器接口中的功能。
- Client(客戶端類):即要使用迭代器模式的地方。
4.實現
繼續以快遞舉例子,貨架上有很多快遞包,取快遞時我們報出手機號,然后快遞小哥就遍歷貨架上所有的快遞信息,直到找出快遞包為止:
4.1 創建迭代器接口
public interface Iterator {
boolean hasNext(); //是否存在下一條記錄
Object next(); //返回當前記錄并移到下一條記錄
}
4.2 創建容器接口
定義容器的基本功能以及提供創建迭代器的接口:
public interface Aggregate {
int size();//容器大小
String get(int location);//獲取獲取中指定位置的號碼
void add(String tel);//添加號碼到容器中
void remove(String tel);//從容器中移除號碼
Iterator iterator();//返回容器的迭代器
}
4.3 創建具體迭代器類
實現迭代器接口:
//快遞迭代類
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 創建具體容器類
實現容器接口中的功能:
//快遞容器類
public class DeliveryAggregate implements Aggregate {
private List<String> list = new ArrayList<>();//內部使用list來存儲數據
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("后面沒有了");
}
輸出結果:
當前號碼為:1111
當前號碼為:2222
當前號碼為:3333
當前號碼為:9527
后面沒有了
5. 應用場景
- 遍歷一個容器對象時。
- 實際我們開發中很少使用到迭代器模式。雖然不怎么用得到,但是了解其原理能夠讓我們在看到相關的源碼(如Java中的Map、List等等容器)時能夠更容易了解源碼的相關思想。
6. 優點
- 可以支持以不同的方式去遍歷容器對象,如順序遍歷,逆序遍歷等等。
- 符合單一職責原則,容器類與遍歷算法的分離,不同類負責不同的功能。
7. 缺點
- 會產生多余的對象,消耗內存。
- 會增多類文件。
- 遍歷過程是一個單向且不可逆的遍歷。
- 遍歷過程需要注意容器是否改變,若期間改變了,可能會拋出異常。
8. Android中的源碼分析
除了Java中的Map、List等有用到迭代器模式之外,Android中使用數據庫查詢時返回的Cursor游標對象,實際上就是使用了迭代器模式來實現,首先先讓我們來看下怎么使用Cursor:
8.1 使用Cursor
Cursor cursor = sqLiteDatabase.query("table", null, null, null, null, null, null);//各種參數請自行查詢用法,這里就不說明了
if (cursor.moveToFirst()) {//游標指向第一行
do {
cursor.getInt(0);//獲得第一列數據
cursor.getString(1);//獲得第二列數據
} 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等的源碼,那個更直觀簡單。
相關文章閱讀
Android的設計模式-設計模式的六大原則
一句話總結23種設計模式則
創建型模式:
Android的設計模式-單例模式
Android的設計模式-建造者模式
Android的設計模式-工廠方法模式
Android的設計模式-簡單工廠模式
Android的設計模式-抽象工廠模式
Android的設計模式-原型模式
行為型模式:
Android的設計模式-策略模式
Android的設計模式-狀態模式
Android的設計模式-責任鏈模式
Android的設計模式-觀察者模式
Android的設計模式-模板方法模式
Android的設計模式-迭代器模式
Android的設計模式-備忘錄模式
Android的設計模式-訪問者模式
Android的設計模式-中介者模式
Android的設計模式-解釋器模式
Android的設計模式-命令模式
結構型模式:
Android的設計模式-代理模式
Android的設計模式-組合模式
Android的設計模式-適配器模式
Android的設計模式-裝飾者模式
Android的設計模式-享元模式
Android的設計模式-外觀模式
Android的設計模式-橋接模式