Android 迭代器模式
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額外提供一個遍歷方法。