デザインパターンの学習
今回はデザインパターンの学習記録をする。
アウトプットとして書くだけなのできれいにまとまらないと思う。
Iterator
Iteratorパターン
何かがたくさん集まっているときに、それを順番に指し示していき、全体をスキャンしていく処理を行うためのもの。
数え上げの仕組みがAggregateの外に置かれている特徴がある。この特徴によれ、1つのConcreteAggregateに対して複数のConcreteIteratorを作れる。
Aggregateインタフェース
数え上げるものの集合体。
宣言するメソッドはiteratorメソッドのみ。
iteratorメソッドはiteratorを1個作成するためのメソッド。
集合体の数え上げ、スキャンはiteratorメソッドを使ってIteratorインタフェースを実装したクラスのインスタンスを1個作成する。
Iteratorインタフェース
要素の数え上げを行うもの、ループ変数のような役割を果たすもの。
最も単純なものでは、「次の要素」が存在するか調べるメソッドと「次の要素」を得るためのメソッドを宣言する。
次の要素を取得する際は、裏では内部状態を次に進める処理が動いている。
Iteratorパターンの要素
Iterator(反復子)の役
要素を順番にスキャンするインタフェースを定める。次の要素が存在するかどうかを得るメソッド、次の要素を得るメソッドを定義する。
ConcreteIterator(具体的な反復子)の役
Iterator役が定めたインタフェースを実装する役。スキャンするために必要な情報ももっておく必要がある。
Aggregate(集合体)の役
Iterator役を作りだすインタフェースを定める。スキャンしてくれる人を作り出す。
ConcreteAggregate(具体的な集合体)の役
Aggregate役が定めたインタフェースを実装する役。ConcreteIterator役を作り出す。
なぜIteratorを使うのか?
実際の実装とは切り離して数え上げができるから。実装したものに依存しない。
注意点
AggegateとItteratorは依存している。
具体的なクラスだけを使うとクラス間の結合が強くなる。
「次」メソッドは現在の位置を返しつつ次の位置に進める。