登場人物(?)

Iterator

要素を順番にアクセスするためのオブジェクト

最低限以下の要素が必要

  1. 次の要素が存在するか
  2. 次の要素が何か

Aggregate(Iterable)

Aggregate内の要素を順番にアクセスするためのIteratorを生成するためのオブジェクト

概要(ざっくりイメージ)

Aggregator内の要素を順番に取り出すためのメソッドがIterator

Iterator

Iteratorには、以下の二つを持つオブジェクトである必要がある

  1. 次の要素が存在するか
  2. 次の要素が何か

dartでの例

class Iterator<T> {
  bool hasNext() {
    // 次の要素が存在するか
  }

  <T> next() {
    // 次の要素が何か
  }
}

Iteratorはこれだけを提供する

hasNextnextのロジックはなんでもいい

(hasNextnextのメソッド名は言語によって変わるため注意)

dartのclassで実装しているが、 jsのオブジェクトでもいい。

とにかくこの2種類のメソッドを提供するオブジェクトであれば、Iteratorと呼べる

Aggregator

Aggregator自身が持ってる要素に順番にアクセスするためのIteratorを生成するためのオブジェクト

内部構造を隠して、Iteratorを生成して返すためのメソッドを提供する

(中身が配列じゃなくても、Iteratorを生成して返すことができる)

(呼び出し側は気にしない)

class Aggregator<T> {
  List<T> items;
  Iterator<T> createIterator() {
    // Iteratorを生成して返す
    return Iterator<T>(items);
  }
}

具体例

宝くじ(Lottery)で例える

class Lottery {}

Iteratorは購入者に対して宝くじを返すためのオブジェクト(定員さん)

class LotteryStaff {
  List<Lottery> lotteries;
  LotteryStaff(this.lotteries);

  bool hasNext() {
    // 次の宝くじが存在するか
  }
  Lottery next() {
    // 渡す宝くじがどのくじか
    // くじの山から上から取ってもいいし、下からとってもいい(自由に差し替えられる)
  } 
}

Aggregateは宝くじ売り場

  • 宝くじがたくさん用意されている
  • 定員さんがいる(Iterator)
class LotteryShop {
  List<Lottery> lotteries;
  LotteryStaff staff;
  LotteryShop(this.lotteries) {
    staff = LotteryStaff(lotteries);
  }

  LotteryStaff createIterator() {
    // 定員さんを生成して返す
    return staff;
}

使い所(まとめ)

基本的には配列などのコレクションで十分だが、

取り出し方を工夫したい時それを共通化したい時

には役に立ってくれるだろう

参考