パンくず
書籍 Patterns to Patterns
Generalization
Replace One/Many Distinction with Composite
使用する場面
あるクラスがひとつのオブジェクトと多数のオブジェクトを扱うメソッドを別々に持っている時。
対応方法
Compositeパターンを適用する
利点と欠点
利点
・ひとつのオブジェクトと多数のオブジェクトのハンドリングよる重複を削除する
・ひとつのオブジェクトと多数のオブジェクト対して統一された方法を提供する
・多くのオブジェクトによりリッチな方法を提供する
欠点
・Compositeの構築時にタイプセーフかどうか確認が必要
手順
定義
one-object methodはひとつのオブジェクトを呼ぶメソッド many-object method は多数のオブジェクトを呼ぶメソッド
1. many-object method はパラメータをコレクションとして扱う。
コンストラクタに、リストを受け取るクラスを新たに作成する。
このCompositeクラスはデザインパターンのCompositeになる。
many-object method はあらたなCompositeクラスで宣言され、インスタンス化される。
さらに、many-object method を呼び出している箇所を調べ呼び出しを置き換えます。
2.メソッドの抽出を適用し、publicメソッドにする。
メソッドの移動で many-object method を移動する。
3. many-object method は one-object methodと区別されている。
この差は many-object method はCompositeであること。
もし、他に違いがあればリファクタリングでそれらを排除する。
4. one-object methodと many-object method に共通のインターフェースを作成する
5. 一行だけになったmany-object method をインライン化する。
サンプル
サンプルはGoFのデザインパターンのCompositeパターンへ