banner
jzman

jzman

Coding、思考、自觉。
github

イテレーターパターン

PS: すべての素晴らしいことは、日常的になると貴重さを失います。

イテレーターデザインパターンは、一連の要素に順番にアクセスする方法を提供するための一般的なデザインパターンであり、同時にそのオブジェクトの内部表現を公開しません。イテレーターデザインパターンは、動作型デザインパターンに属しています。

  1. 関連する概念
  2. 使用シーン
  3. Java の実装
  4. Dart の実装

関連する概念#

  • 抽象集約役:集約オブジェクトの追加、削除などの操作メソッドとイテレーターの作成メソッドを定義します。
  • 具体的な集約役:抽象集約役の具体的な実装クラスです。
  • 抽象イテレーター役:イテレーターに関連するメソッドを定義します。例えば、hasNext、first、last などのメソッドです。
  • 具体的なイテレーター役:抽象イテレーター役の具体的な実装クラスです。

使用シーン#

イテレーターデザインパターンの使用シーンは以下の通りです:

  1. 特定のデータ構造のための反復方法を提供するため。
  2. 集約オブジェクトの実装の詳細を隠すためにイテレーターデザインパターンを使用することができます。
  3. 複数の集約オブジェクトが存在する場合、イテレーターデザインパターンを使用すると、データ構造の違いを隠すことができます。

Java の実装#

イテレーターデザインパターンの簡単な実装例を以下に示します。抽象集約役の定義は次のようになります:

/**
 * 抽象集約役
 * Created by jzman
 * Powered by 2019/12/22.
 */
interface Aggregate {
    Iterator createIterator();
}

抽象イテレーター役の定義は次のようになります:

/**
 * 抽象イテレーター役
 * Created by jzman
 * Powered by 2019/12/22.
 */
interface Iterator {
    Object first();
    Object next();
    boolean isDone();
    Object currentItem();
}

具体的な集約役と具体的なイテレーター役の実装は次のようになります:

/**
 * 具体的な集約役
 * Created by jzman
 * Powered by 2019/12/22.
 */
class ConcreteAggregate implements Aggregate {
    private List<Object> mList;
    
    public ConcreteAggregate(List<Object> mList) {
        this.mList = mList;
    }
    
    @Override
    public Iterator createIterator() {
        return new ConcreteIterator();
    }

    /**
     * 具体的なイテレーター役
     */
    private class ConcreteIterator implements Iterator {

        private int mCursor;

        @Override
        public Object first() {
            return mList.get(0);
        }

        @Override
        public Object next() {
            mCursor++;
            if (mCursor < mList.size()) {
                return mList.get(mCursor);
            }
            return null;
        }

        @Override
        public boolean isDone() {
            return mCursor >= mList.size();
        }

        @Override
        public Object currentItem() {
            return mList.get(mCursor);
        }
    }
}

上記のコードをテストします:

/**
 * イテレーターテスト
 * Created by jzman
 * Powered by 2019/12/22.
 */
class Client {
    public static void main(String[] args) {
        List<Object> objects = new ArrayList<>();
        objects.add("A");
        objects.add("B");
        objects.add("C");
        ConcreteAggregate aggregate = new ConcreteAggregate(objects);

        // イテレーターを取得
        Iterator iterator = aggregate.createIterator();
        // 反復
        while (!iterator.isDone()) {
            Object o = iterator.currentItem();
            System.out.println("data:" + o);
            iterator.next();
        }
    }
}

テスト結果は以下の通りです:

data:A
data:B
data:C

Dart の実装#

main(){
  List<Object> mList = ["A","B","C"];
  Aggregate aggregate = new ConcreteAggregate(mList);
  Iterator iterator = aggregate.createIterator();
  while (!iterator.isDone()) {
    Object obj = iterator.currentItem();
    print("data:${obj.toString()}");
    iterator.next();
  }
}

// 抽象イテレーター役
abstract class Iterator{
  Object first();
  Object next();
  bool isDone();
  Object currentItem();
}

//具体イテレーター役
class ConcreteIterator implements Iterator{
  int mCursor = 0;
  List<Object> mList;

  ConcreteIterator(this.mList);

  @override
  Object first() {
      return mList[0];
  }

  @override
  Object next() {
      mCursor++;
      if (mCursor < mList.length) {
          return mList[mCursor];
      }
      return null;
  }

  @override
  bool isDone() {
      return mCursor >= mList.length;
  }

  @override
  Object currentItem() {
      return mList[mCursor];
  }
}

// 抽象集約役
abstract class Aggregate {
  Iterator createIterator();
}

// 具体集約役
class ConcreteAggregate implements Aggregate{
  List<Object> mList;
  ConcreteAggregate(this.mList);
  @override
  Iterator createIterator(){
    return new ConcreteIterator(mList);
  }
}

テスト結果は以下の通りです:

data:A
data:B
data:C

イテレーターデザインパターンは、コレクションの反復処理に頻繁に使用されますが、使用する際にはデザインパターンの概念がないかもしれません。しかし、このような概念は、自分のコーディング能力を潜在的に向上させることがあります。

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。