0x01:迭代器模式簡介
Java中可以說已經(jīng)把迭代器模式用到了極致,每一個集合類都關(guān)聯(lián)了一個迭代器類Iterator兆旬。
迭代器模式(Iterator)假抄,提供一種方法順序訪問一個聚合對象中的各種元素,而又不暴露該對象的內(nèi)部表示丽猬。UML類圖如下:
其中宿饱,Aggregate是聚集抽象類,負責(zé)提供創(chuàng)建具體迭代器角色的接口脚祟;Iterator是迭代抽象類谬以,用于定義得到開始對象、得到下一個對象由桌、判斷是否到結(jié)尾为黎、當前對象等抽象方法邮丰,統(tǒng)一接口;ConcreteAggregate是具體聚集類铭乾,繼承Aggregate剪廉;ConcreteIterator是具體迭代器類,繼承Iterator炕檩,實現(xiàn)開始斗蒋、下一個、是否結(jié)尾笛质、當前對象等方法泉沾。具體角色說明:
Iterator(迭代器):迭代器定義訪問和遍歷元素的接口;
ConcreteIterator (具體迭代器):具體迭代器實現(xiàn)迭代器接口经瓷,對該聚合遍歷時跟蹤當前位置爆哑;
Aggregate (聚合):聚合定義創(chuàng)建相應(yīng)迭代器對象的接口;
ConcreteAggregate (具體聚合):具體聚合實現(xiàn)創(chuàng)建相應(yīng)迭代器的接口舆吮,該操作返回ConcreteIterator的一個適當?shù)膶嵗?/p>
0x02:迭代器模式實現(xiàn)
抽象聚合:負責(zé)提供接口揭朝,比如定義一個類似createIterator()這樣的方法,在Java集合類里一般是iterator()方法色冀。
public interface Aggregate {
public void add(Object object);
public void remove(Object object);
public Iterator iterator();
}
抽象迭代器:負責(zé)定義訪問和遍歷元素的接口潭袱,基本上有固定的三個方法,即first()獲取第一個元素锋恬、next()訪問下一個元素屯换、hasNext()判斷已經(jīng)遍歷到最后。
public interface Iterator {
public Object next(); //遍歷到下一個元素
public boolean hasNext(); //是否已經(jīng)遍歷到尾部
public boolean remove(); //刪除當前指向的元素
}
具體聚合
public class ConcreteAggregate implements Aggregate {
private List list = new ArrayList();
@Override
public void add(Object object) {
this.list.add(object);
}
public void remove(Object object) {
this.list.remove(object);
}
@Override
public Iterator iterator() {
return new ConcreteIterator(this.list);
}
}
具體迭代器:簡單的實現(xiàn)就是通過一個游標与学,在一個容器中前后移動彤悔,遍歷所有它需要查看的元素
public class ConcreteIterator implements Iterator {
private List list= new ArrayList();
public int cursor = 0; //定義當前游標
public ConcreteIterator(List list) {
this.list= list;
}
@Override
public Object next() {
Object result = null;
if (this.hasNext()) {
result = this.list.get(this.cursor);
this.cursor = this.cursor + 1;
} else {
result = null;
}
return result;
}
@Override
public boolean hasNext() {
if (this.cursor == this.list.size()) {
return false;
}
return true;
}
@Override
public boolean remove() {
this.list.remove(this.cursor);
return true;
}
}
迭代器模式測試代碼
注意引入自己定義的Iterator類,而不是Java內(nèi)部封裝好的java.util.Iterator類索守。
public class Client {
public static void main(String[] args) {
Aggregate aggregate = new ConcreteAggregate();
aggregate.add("java樂園");
aggregate.add("架構(gòu)師知音");
aggregate.add("非常架構(gòu)");
//遍歷
Iterator iterator = aggregate.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}
}
0x03:JDK中的迭代器源碼分析
在JDK涉及到的迭代器Iterator都與集合有關(guān)晕窑,主要相關(guān)實現(xiàn)在java.util包下。下面以 ArrayList 為例進行分析:
java.lang.Iterable類:表示一個可以被迭代的對象
public interface Iterable<T> {
Iterator<T> iterator();
default void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
}
default Spliterator<T> spliterator() {
return Spliterators.spliteratorUnknownSize(iterator(), 0);
}
}
java.util.Iterator:表示抽象迭代器
public interface Iterator<E> {
boolean hasNext();
E next();
default void remove() {
throw new UnsupportedOperationException("remove");
}
default void forEachRemaining(Consumer<? super E> action) {
Objects.requireNonNull(action);
while (hasNext())
action.accept(next());
}
}
java.util.Collection:表示抽象聚合對象
public interface Collection<E> extends Iterable<E> {
Iterator<E> iterator();
boolean add(E e);
boolean remove(Object o);
boolean addAll(Collection<? extends E> c);
boolean removeAll(Collection<?> c);
//其他省略
.......
}
java.util.AbstractList.Itr:具體迭代器實現(xiàn)類卵佛,該類是 java.util.AbstractList 類的一個內(nèi)部類
private class ListItr extends Itr implements ListIterator<E> {
//具體代碼省略
.......
}
java.util.ArrayList:具體聚合對象
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
//具體代碼省略
.......
}
java.util.ArrayList整體實現(xiàn)UML類圖
[來源:https://www.alicharles.com/article/design-pattern/jdk-iterator-pattern/]
研讀JDK源碼的迭代器模式杨赤,可以非常有效的學(xué)習(xí)和理解迭代器模式。從代碼上看JDK的迭代器源碼比小編實現(xiàn)的復(fù)雜很多截汪,但是基本原理無兩疾牲。常常研讀大神的源碼有利于提升技術(shù)能力。