­

Java描述設計模式(13):迭代器模式

  • 2019 年 10 月 6 日
  • 筆記

一、迭代器模式

1、基礎概念

迭代器模式又叫游標模式,是對象的行為模式。迭代器模式可以順序地訪問一個聚集中的元素而不必暴露聚集的內部表象。

2、模式圖解

3、核心角色

  • Iterator:迭代器角色

此抽象角色定義出遍曆元素所需的接口。

  • ConcreteIterator:具體迭代器角色

此角色實現了Iterator接口,並保持迭代過程中的游標位置。

  • Aggregate:聚集角色

此抽象角色給出創建迭代器(Iterator)對象的接口。

  • ConcreteAggregate:具體聚集角色

聚合持有對象集合,提供返回迭代器的方法,可以正確遍歷該集合。

  • Client:客戶端角色

持有對聚集及其迭代器對象的引用,調用迭代器對象的迭代接口。

4、源碼案例

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;      }  }  

二、JDK集合應用

1、簡單案例

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());          }      }  }  

2、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());      }  }  

3、ArrayList源碼

  • 實現聚合接口List
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();  }  

三、迭代器總結

1、適用場景

迭代器模式是與集合綁定,只要使用集合,就需要同時這個集合的迭代器,以此遍歷集合中的數據,java中的容器對象Collection,List、Set、Map都有自己的迭代器。容器對象在編程語言中十分核心,所以在實現容器的時候基本都有匹配的迭代器,可以滿足開發的需要,所以迭代器的自定義實踐場景比較少。

2、優點總結

簡化集合遍歷方式,每一個聚集對象都可以有一個或多個迭代器對象,每一個迭代器的迭代狀態可以是彼此獨立的。遍歷算法被封裝在迭代器角色裏面,因此迭代的算法可以獨立於聚集角色變化。

四、源代碼地址

GitHub·地址  https://github.com/cicadasmile/model-arithmetic-parent  GitEE·地址  https://gitee.com/cicadasmile/model-arithmetic-parent