イテレータパターン(13)に記載のJavaデザインパターン

この記事の出所:GitHubにはこちらをクリック・ || GitEE・こちらをクリック

まず、イテレータパターン

1、基本的な考え方

カーソルモードとして知られているイテレータパターンは、オブジェクトの挙動です。反復子パターン要素を順次集合体の内部を露出することなく、クラスタ化された外観にアクセスすることができます。

図2に示すように、パターンを示し

3、中核的な役割

  • イテレータ:イテレータの役割

必要なの役割のこの抽象定義は、インタフェース要素をトラバース。

  • ConcreteIterator:具体的なイテレータの役割

この役割は、Iteratorインターフェイスを実装し、カーソル位置反復プロセスを続けます。

  • 集計:集計役割

この役割は、抽象イテレータ(イテレータ)オブジェクトのインターフェイスを作成するために与えられています。

  • ConcreteAggregate:特定の役割を集めます

重合方法は、イテレータが正しくセットを横切ることができる返すが提供され、オブジェクトのコレクションを保持しています。

  • クライアント:クライアントの役割

収集し、イテレータオブジェクトの参照を保持するには、インターフェイスイテレータイテレータオブジェクトを呼び出します。

図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、イテレータ源

これは、コレクションの反復法の数を提供します。

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のソース

  • 統合インターフェースのリストを達成
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コンテナオブジェクト、リスト、セット、マップが独自のイテレータを持っています。その基本的なコンテナのイテレータの実現に非常にコアプログラミング言語のコンテナオブジェクトは、開発のニーズを満たすために一致しているので、シーンは比較的小さいカスタム練習イテレータです。

2、利点をまとめたもの

トラバーサルの簡略セットは、各集約オブジェクトが1つ以上のイテレータオブジェクトを有することができ、各反復イテレータの状態は、互いに独立していてもよいです。トラバーサルアルゴリズムでイテレータロール内部に封入されているので、反復アルゴリズムは、凝集の変化役割の独立していてもよいです。

第四に、送信元アドレス

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

おすすめ

転載: www.cnblogs.com/cicada-smile/p/11570299.html