溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Java描述設(shè)計(jì)模式(13):迭代器模式

發(fā)布時(shí)間:2020-07-17 00:25:09 來(lái)源:網(wǎng)絡(luò) 閱讀:167 作者:知了一笑 欄目:編程語(yǔ)言

本文源碼:GitHub·點(diǎn)這里 || GitEE·點(diǎn)這里

一、迭代器模式

1、基礎(chǔ)概念

迭代器模式又叫游標(biāo)模式,是對(duì)象的行為模式。迭代器模式可以順序地訪問(wèn)一個(gè)聚集中的元素而不必暴露聚集的內(nèi)部表象。

2、模式圖解

Java描述設(shè)計(jì)模式(13):迭代器模式

3、核心角色

  • Iterator:迭代器角色

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

  • ConcreteIterator:具體迭代器角色

此角色實(shí)現(xiàn)了Iterator接口,并保持迭代過(guò)程中的游標(biāo)位置。

  • Aggregate:聚集角色

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

  • ConcreteAggregate:具體聚集角色

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

  • Client:客戶端角色

持有對(duì)聚集及其迭代器對(duì)象的引用,調(diào)用迭代器對(duì)象的迭代接口。

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{
    //持有被迭代的聚合對(duì)象
    private ConcreteAggregate agg;
    //記錄當(dāng)前迭代索引位置
    private int index = 0;
    //設(shè)置當(dāng)前聚集對(duì)象的大小
    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 {
    // 創(chuàng)建相應(yīng)迭代器對(duì)象的接口
    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集合應(yīng)用

1、簡(jiǎn)單案例

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源碼

規(guī)定了集合迭代的一些方法。

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源碼

  • 實(shí)現(xiàn)聚合接口List

    ArrayList<E> extends AbstractList<E> implements List<E>
  • 內(nèi)部迭代器接口實(shí)現(xiàn)

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

三、迭代器總結(jié)

1、適用場(chǎng)景

迭代器模式是與集合綁定,只要使用集合,就需要同時(shí)這個(gè)集合的迭代器,以此遍歷集合中的數(shù)據(jù),java中的容器對(duì)象Collection,List、Set、Map都有自己的迭代器。容器對(duì)象在編程語(yǔ)言中十分核心,所以在實(shí)現(xiàn)容器的時(shí)候基本都有匹配的迭代器,可以滿足開(kāi)發(fā)的需要,所以迭代器的自定義實(shí)踐場(chǎng)景比較少。

2、優(yōu)點(diǎn)總結(jié)

簡(jiǎn)化集合遍歷方式,每一個(gè)聚集對(duì)象都可以有一個(gè)或多個(gè)迭代器對(duì)象,每一個(gè)迭代器的迭代狀態(tài)可以是彼此獨(dú)立的。遍歷算法被封裝在迭代器角色里面,因此迭代的算法可以獨(dú)立于聚集角色變化。

四、源代碼地址

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

Java描述設(shè)計(jì)模式(13):迭代器模式

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI