Iterator

  • コレクションの内部構造を利用者に見せずに、その要素に順番にアクセスする方法を提供するパターン

コレクションとは

配列や連想配列などのデータをまとめて格納するもの

  • ループ処理のインデックスiの役割を抽象化し一般化したもの
  • 「カプセル化の逆」を利用したパターン
  • データと操作を1つのクラスにまとめるのが「カプセル化」
  • IteratorではAggregateの操作を切り出して別のクラスとして定義
  • 別クラスとして切り出すことで、コレクションクラスがシンプルに保たれ、再利用性やメンテナンス性を高めることができる

メリット・デメリット

メリット
  • 利用者がコレクションの詳細なデータ構造を知る必要がなくなる
  • コレクションの実装と探索のためのアルゴリズムを分離することができる
  • 既存のコードに修正を加えることなく、新しい種類のコレクションやイテレーターを追加できる
デメリット
  • 単純なコレクションの場合、Iteratorを使用しない方がコードがシンプルになる

用途

  • コレクションが複雑なデータ構造をしており、その複雑さを利用者から隠したい場合
    • Iteratorのメソッドを呼び出すだけでデータを取得可能
  • 探索のための方法を複数持たせたい場合
    • オープンクローズドの原則に違反することなく探索のためのロジックを追加可能
classDiagram  
class Shape {  
<<interface>>  
+draw() void  
}

デザインパターンの種類

振る舞いに関するデザインパターン

例(Mermaid)

  • Iterator
    • コレクションを探索するために必要な操作を定義するインターフェース
  • ConcreteIterator
    • Iteratorで定義したメソッドを実装するクラス
    • ConcreteIteratorの実装によって探索の内容を変更することができる
    • 探索を行うコレクションをフィールドに持つ
  • Aggregate
    • 探索を行うコレクションを表すインターフェース
    • Iteratorを生成するためのメソッドを定義
  • ConcreteAggregate
    • Aggregateで定義したメソッドを実装するクラス
    • 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
	}