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

本文源碼:GitHub·點這裏 || GitEE·點這裏java

1、迭代器模式

一、基礎概念

迭代器模式又叫遊標模式,是對象的行爲模式。迭代器模式能夠順序地訪問一個彙集中的元素而沒必要暴露彙集的內部表象。

二、模式圖解

圖片描述

三、核心角色

  • Iterator:迭代器角色
此抽象角色定義出遍歷元素所需的接口。
  • ConcreteIterator:具體迭代器角色
此角色實現了Iterator接口,並保持迭代過程當中的遊標位置。
  • Aggregate:彙集角色
此抽象角色給出建立迭代器(Iterator)對象的接口。
  • ConcreteAggregate:具體彙集角色
聚合持有對象集合,提供返回迭代器的方法,能夠正確遍歷該集合。
  • Client:客戶端角色
持有對彙集及其迭代器對象的引用,調用迭代器對象的迭代接口。

四、源碼案例

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

2、JDK集合應用

一、簡單案例

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

二、Iterator源碼

規定了集合迭代的一些方法。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源碼

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

3、迭代器總結

一、適用場景github

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

二、優勢總結算法

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

4、源代碼地址

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

相關文章
相關標籤/搜索