本文源碼:GitHub·點這裏 || GitEE·點這裏java
迭代器模式又叫遊標模式,是對象的行爲模式。迭代器模式能夠順序地訪問一個彙集中的元素而沒必要暴露彙集的內部表象。
此抽象角色定義出遍歷元素所需的接口。
此角色實現了Iterator接口,並保持迭代過程當中的遊標位置。
此抽象角色給出建立迭代器(Iterator)對象的接口。
聚合持有對象集合,提供返回迭代器的方法,能夠正確遍歷該集合。
持有對彙集及其迭代器對象的引用,調用迭代器對象的迭代接口。
public class C02_Iterator { public static void main(String[] args) { Object[] objArray = {"one","two","three","four","five"}; Aggregate aggregate = new ConcreteAggregate(objArray); Iterator iterator = aggregate.createIterator(); while (!iterator.isEnd()){ System.out.println(iterator.currentItem()); iterator.next(); } } } interface Iterator { void first(); void next(); boolean isEnd(); Object currentItem(); } class ConcreteIterator implements Iterator{ //持有被迭代的聚合對象 private ConcreteAggregate agg; //記錄當前迭代索引位置 private int index = 0; //設置當前彙集對象的大小 private int size = 0; public ConcreteIterator (ConcreteAggregate agg){ this.agg = agg; this.size = agg.getSize(); index = 0; } @Override public void first() { index = 0; } @Override public void next() { if (index<size){ index++; } } @Override public boolean isEnd() { return (index>=size); } @Override public Object currentItem() { return agg.getElement(index); } } abstract class Aggregate { // 建立相應迭代器對象的接口 public abstract Iterator createIterator(); } class ConcreteAggregate extends Aggregate{ private Object[] objArray = null; public ConcreteAggregate (Object[] objArray){ this.objArray = objArray; } @Override public Iterator createIterator() { return new ConcreteIterator(this); } public Object getElement (int index){ if (index<objArray.length){ return objArray[index]; } else { return null; } } public int getSize (){ return objArray.length; } }
public class C02_ArrayList { public static void main(String[] args) { List<String> stringList = new ArrayList<>() ; stringList.add("One") ; stringList.add("Two") ; stringList.add("Three") ; java.util.Iterator<String> itr = stringList.iterator() ; while (itr.hasNext()){ System.out.println(itr.next()); } } }
規定了集合迭代的一些方法。git
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()); } }
ArrayList<E> extends AbstractList<E> implements List<E>
private class Itr implements Iterator<E> { int cursor; int lastRet = -1; int expectedModCount = modCount; Itr() {} public boolean hasNext() {} public E next() {} public void remove() {} public void forEachRemaining(Consumer<? super E> consumer) {} final void checkForComodification() {} }
public Iterator<E> iterator() { return new Itr(); }
一、適用場景github
迭代器模式是與集合綁定,只要使用集合,就須要同時這個集合的迭代器,以此遍歷集合中的數據,java中的容器對象Collection,List、Set、Map都有本身的迭代器。容器對象在編程語言中十分核心,因此在實現容器的時候基本都有匹配的迭代器,能夠知足開發的須要,因此迭代器的自定義實踐場景比較少。
二、優勢總結算法
簡化集合遍歷方式,每個彙集對象均可以有一個或多個迭代器對象,每個迭代器的迭代狀態能夠是彼此獨立的。遍歷算法被封裝在迭代器角色裏面,所以迭代的算法能夠獨立於彙集角色變化。
GitHub·地址 https://github.com/cicadasmile/model-arithmetic-parent GitEE·地址 https://gitee.com/cicadasmile/model-arithmetic-parent