Android 設計模式系列文章 Android 23種設計模式
前言
迭代器模式又稱爲遊標模式,源於對容器的訪問,比如java中的List、Map、數組等,提供一個合理的遍歷訪問。用法就是在用戶訪問類,和容器之間插入一個迭代器,提供遍歷訪問。這樣做可以讓容器功能保持單一,不用在容器內實現遍歷功能。也不用對外提供內部訪問方法導致細節暴露。
迭代器模式定義
迭代器模式(Iterator),提供一種方法順序訪問一個聚合對象中的各種元素,而又不暴露該對象的內部表示。
例子
廢話再多,也不如一個例子來的乾脆。
1、先寫一個迭代器
抽象迭代器方法
public interface Iterator<T> {
boolean hasNext();
T next();
}
實現迭代器
public class IteratorImpl<T> implements Iterator<T> {
private List<T> list = new ArrayList<T>();
private int cursor = 0;
public IteratorImpl(List<T> list) {
this.list = list;
}
@Override
public boolean hasNext() {
return cursor != list.size();
}
@Override
public T next() {
T obj = null;
if (this.hasNext()) {
obj = this.list.get(cursor++);
}
return obj;
}
}
迭代器核心其實就是給帶入的list提供一個遍歷的方法。
2、寫一個容器
抽象容器方法
public interface Container<T> {
void add(T obj);
void remove(T obj);
Iterator<T> iterator();
}
實現容器
public class ContainerImpl<T> implements Container<T> {
private List<T> list = new ArrayList<T>();
@Override
public void add(T obj) {
list.add(obj);
}
@Override
public void remove(T obj) {
list.remove(obj);
}
@Override
public Iterator<T> iterator() {
return new IteratorImpl<>(list);
}
}
我們使用容器的時候,只要提供一個構建迭代器的方法就可以了。迭代器自行對外提供遍歷方法。
3、客戶端調用
// 創建一個容器
ContainerImpl<String> containerImpl = new ContainerImpl<>();
containerImpl.add("jack");
containerImpl.add("mom");
containerImpl.add("dad");
containerImpl.add("john");
// 根據容器創建一個迭代器
Iterator<String> iterator = containerImpl.iterator();
// 迭代器提供遍歷方法,遍歷
while (iterator.hasNext()) {
Log.d("Iterator",iterator.next());
}
log輸出如下:
11-26 19:01:43.249 28429-28429/com.yink.designpattern.designpattern D/Iterator: jack
11-26 19:01:43.249 28429-28429/com.yink.designpattern.designpattern D/Iterator: mom
11-26 19:01:43.249 28429-28429/com.yink.designpattern.designpattern D/Iterator: dad
11-26 19:01:43.249 28429-28429/com.yink.designpattern.designpattern D/Iterator: john
迭代器模式小結
迭代器模式結構很簡單,就是提供一個list的遍歷方法。目的很明確,弱化遍歷算法和容器之間的關係。其實我們平時開發之中已經很少需要自己去實現迭代器,因爲現在不管是Object,C++,python等等,他們直接實現了這種結構。但是理解這種設計模式也是不錯的。像Android源碼中數據庫中的遊標Cursor也是用的這種結構。
結束語
迭代器模式比較簡單,也沒啥多說的,最後強調迭代器模式記憶要點:根據傳入的list額外提供一個遍歷方法。