Iterator
- コレクションの内部構造を利用者に見せずに、その要素に順番にアクセスする方法を提供するパターン
コレクションとは
配列や連想配列などのデータをまとめて格納するもの
- ループ処理のインデックス
iの役割を抽象化し一般化したもの - 「カプセル化の逆」を利用したパターン
- データと操作を1つのクラスにまとめるのが「カプセル化」
IteratorではAggregateの操作を切り出して別のクラスとして定義- 別クラスとして切り出すことで、コレクションクラスがシンプルに保たれ、再利用性やメンテナンス性を高めることができる
メリット・デメリット
メリット
- 利用者がコレクションの詳細なデータ構造を知る必要がなくなる
- コレクションの実装と探索のためのアルゴリズムを分離することができる
- 既存のコードに修正を加えることなく、新しい種類のコレクションやイテレーターを追加できる
デメリット
- 単純なコレクションの場合、
Iteratorを使用しない方がコードがシンプルになる
用途
- コレクションが複雑なデータ構造をしており、その複雑さを利用者から隠したい場合
Iteratorのメソッドを呼び出すだけでデータを取得可能
- 探索のための方法を複数持たせたい場合
- オープンクローズドの原則に違反することなく探索のためのロジックを追加可能
classDiagram class Shape { <<interface>> +draw() void }
デザインパターンの種類
振る舞いに関するデザインパターン
例(Mermaid)
Iterator- コレクションを探索するために必要な操作を定義するインターフェース
ConcreteIteratorIteratorで定義したメソッドを実装するクラスConcreteIteratorの実装によって探索の内容を変更することができる- 探索を行うコレクションをフィールドに持つ
Aggregate- 探索を行うコレクションを表すインターフェース
Iteratorを生成するためのメソッドを定義
ConcreteAggregateAggregateで定義したメソッドを実装するクラスConcreteIteratorクラスの新しいインスタンスを返却する
classDiagram Iterator <|.. ConcreteIterator Iterator <-- Aggregate Aggregate <|.. ConcreteAggregate ConcreteAggregate <--o ConcreteIterator class ConcreteIterator { aggregate hasNext() boolean next() } class Iterator { <<interface>> hasNext() boolean next() } class ConcreteAggregate { getIterator() Iterator } class Aggregate { <<interface>> getIterator() Iterator }