登場人物(?)
Iterator
要素を順番にアクセスするためのオブジェクト
最低限以下の要素が必要
- 次の要素が存在するか
- 次の要素が何か
Aggregate(Iterable)
Aggregate内の要素を順番にアクセスするためのIteratorを生成するためのオブジェクト
概要(ざっくりイメージ)
Aggregator内の要素を順番に取り出すためのメソッドがIterator
Iterator
Iteratorには、以下の二つを持つオブジェクトである必要がある
- 次の要素が存在するか
- 次の要素が何か
dartでの例
class Iterator<T> {
bool hasNext() {
// 次の要素が存在するか
}
<T> next() {
// 次の要素が何か
}
}
Iteratorはこれだけを提供する
hasNextやnextのロジックはなんでもいい
(hasNextやnextのメソッド名は言語によって変わるため注意)
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;
}
使い所(まとめ)
基本的には配列などのコレクションで十分だが、
取り出し方を工夫したい時 や それを共通化したい時
には役に立ってくれるだろう