目錄
1. 迭代器模式的定義
提供一種方法順序訪問一個容器中的各個對象,而又不需要暴露對象的內部表示
2. 迭代器模式的使用場景
遍歷一個容器對象時
3. UML圖與實例代碼
實例代碼
public class IteratorPattern {
public static void main(String[] args) {
Aggregate aggregate = new ConcreteAggregate();
aggregate.add("小明");
aggregate.add("小紅");
aggregate.add("小剛");
Iterator iterator = aggregate.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}
}
// 容器
interface Aggregate {
public void add(Object object);
public void remove(Object object);
public Iterator iterator();
}
class ConcreteAggregate implements Aggregate {
private List<Object> list = new ArrayList<>();
@Override
public void add(Object object) {
list.add(object);
}
@Override
public void remove(Object object) {
list.remove(object);
}
@Override
public Iterator iterator() {
return new ConIterator(list);
}
}
interface Iterator<T> {
T next();
T first();
boolean hasNext();
}
// 具體的迭代器
class ConIterator implements Iterator {
private List<Object> list = null;
private int index = -1;
public ConIterator(List<Object> list) {
this.list = list;
}
@Override
public Object next() {
Object object = null;
if (this.hasNext()) {
object = list.get(++index);
}
return object;
}
@Override
public Object first() {
index = 0;
Object object = list.get(index);
return object;
}
@Override
public boolean hasNext() {
if (index + 1 < list.size()) {
return true;
}
return false;
}
}
迭代器的使用
Iterator iterator = aggregate.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
迭代器的使用一般都是這種形式,我們不需要知道aggregate中數據結構是怎麼樣的,只需要獲取它的迭代器,並且通過接口就可以遍歷對象了。
總的來說,迭代器一般會有這幾個接口,hasNext、next、remove,而迭代器數據的來源由具體需要被遍歷的對象給出,一般通過構造方法傳入迭代器,或者直接在內部實現迭代器,而迭代器的作用主要是:輸出一個數據,並且把指針移向下一個數據,判斷數據是否已經遍歷完成,刪除其中一個數據。迭代器對數據的操作是單個進行的。
4. 迭代器模式在Android中的應用
Cursor cursor = db.query("user", new String[]{"name"}, null, null, null, null, null);
String textview_data = "";
while(cursor.moveToNext()){
String name = cursor.getString(cursor.getColumnIndex("name"));
}
相信大家都用過Sqlite數據庫,原生的請求方式如上,這裏的Cursor就相當於Iterator,db是database,也就是具體需要被迭代的對象。