導入
Processingがバージョン3.0(2015年8月29日現在3.0b5)となり,
閑話休題。今回はGoFによるデザインパターン23種類のうち,
展開
Iterator(イテレータ)
前述したように,
Iteratorパターンの目的
iterateは「繰り返される,
オブジェクトの集合を取り扱う際,
連載第9回で掲載した配列を利用するコード
String names[] = {"Tim Bray", // 0番目の要素
"Brian Kernighan", // 1番目の要素
"Jon Bentley", // 2番目の要素
"Karl Fogel"}; // 3番目の要素
for(int i = 0; i < names.length; ++i){
println(names[i]);
}Java言語,
先のfor文を拡張for文で書き直したところ
for(String v : names){ println(v); } 上のコード例ではIteratorパターンの存在が隠されています。このコードの裏ではIteratorパターンを利用して配列の要素の先頭から順にアクセスしています。
Iteratorパターンを使うと,
- 「
names[i]として,配列というデータ構造の変数 namesの,
先頭からi番目に納められたString型のデータ」
とアクセスしていたところが,
- 「
String型のデータv」
で済みます。Iteratorパターンに従っていることが分かれば,
[Iteratorパターン]
複数のオブジェクトを順に取り扱う機能を抽象化したもの。
Java言語やProcessingでは,
GoFによるIteratorパターンの全体像
ここでは,
Java言語のクラスライブラリ中で実装されているIteratorパターンは,
下図はIteratorパターンを用いたコードのクラス図の一例です。
Iteratroパターンでは,ConcreteAggregateクラスに納められたデータの集合をClientクラスが順に取り出して処理することを目的とします。図の一番下にあるDataクラスが,ConcreteAggregateクラスが保持するデータ保管用クラスです。Aggregateという英語は「集合」とか「集団」といった意味があります。Concreteは「具体的な実体」です。
Aggregateインタフェイスのiteratorメソッドは,Iteratorインタフェイスを実装したConcreteIteratorオブジェクトを返します。ConcreteIteratorはConcreteAggregateに納められたオブジェクト群にアクセスするコードを持っています。
結局Clientクラスがデータのアクセスに必要とするのは,ConcreteAggregateオブジェクトと,ConcreteIteratorオブジェクトの参照を持つIteratorインタフェイスのオブジェクトです。
- [Clientクラスがデータアクセスに必要とする情報]
- ConcreteAggregateオブジェクトへの参照
- ConcreteAggregateオブジェクトのiteratorメソッドが返すConcreteIteratorへの参照