提供一種方法訪問一個容器對象中各個元素,而又不暴露該對象的內部細節。面試
在遍歷集合的時候,把在元素之間遊走的責任交給迭代器,而不是集合。性能優化
抽象容器 通常是一個接口,提供一個 iterator() 方法,例如 Java 中的 Collection 接口。bash
具體容器 就是抽象容器的具體實現類,好比 List 接口的實現有序列表 ArrayList,List 接口的鏈表實現 LinkList,Set 接口的哈希列表的實現 HashSet 等。架構
抽象迭代器 定義遍歷元素所須要的方法,通常會有兩個方法:取得下一個元素的方法 next(),判斷是否遍歷結束的方法 hasNext(),移出當前對象的方法 remove()。ide
具體迭代器 實現迭代器接口中定義的方法,完成集合的迭代。性能
public interface Aggregate<E> {
/**
* 添加元素
*
* @param data
*/
void add(E data);
/**
* 移除元素
*
* @param data
*/
void remove(E data);
/**
* 迭代器
*
* @return
*/
Iterator<E> iterator();
}
複製代碼
public interface Iterator<E> {
/**
* 是否存在下一個元素
*
* @return
*/
boolean hasNext();
/**
* 獲取下一個元素
*
* @return
*/
E next();
}
複製代碼
public class ConcreteAggregate<E> implements Aggregate<E> {
private List<E> list = new ArrayList<>();
@Override
public void add(E data) {
list.add(data);
}
@Override
public void remove(E data) {
list.remove(data);
}
@Override
public Iterator<E> iterator() {
return new InnerIterator();
}
/**
* 迭代器
*/
private class InnerIterator implements Iterator<E> {
private int cursor;
@Override
public boolean hasNext() {
return cursor < list.size();
}
@Override
public E next() {
E data = list.get(cursor);
cursor++;
return data;
}
}
}
複製代碼
public static void main(String args[]) {
Aggregate<String> aggregate = new ConcreteAggregate<>();
aggregate.add("小劉");
aggregate.add("小李");
aggregate.add("小王");
Iterator<String> iterator = aggregate.iterator();
while (iterator.hasNext()) {
String name = iterator.next();
System.out.println(name);
}
}
複製代碼
1. 優勢 迭代器簡化了遍歷一個聚合對象的方式,在同一個聚合上能夠有多個遍歷。在迭代器模式中,增長新的聚合類和迭代器類都很方便,無須修改原有代碼。學習
2. 缺點 因爲迭代器模式將存儲數據和遍歷數據的職責分離,增長新的聚合類須要對應增長新的迭代器類,類的個數成對增長,這在必定程度上增長了系統的複雜性。測試
3. 使用場景 迭代器模式是與集合共存的。通常來講,咱們只要實現一個集合,就須要同時提供這個集合的迭代器,就像 Java 中的 Collection、Set、Map 等,這些集合都有本身的迭代器。假如咱們要實現一個這樣的新容器,固然也須要引入迭代器模式,給咱們的容器添加一個迭代器。優化
在如今這個金三銀四的面試季,我本身在網上也蒐集了不少資料作成了文檔和架構視頻資料免費分享給你們【包括高級UI、性能優化、架構師課程、NDK、Kotlin、混合式開發(ReactNative+Weex)、Flutter等架構技術資料】,但願能幫助到您面試前的複習且找到一個好的工做,也節省你們在網上搜索資料的時間來學習。ui