Composite-容器と中身の同一視-
Java言語で学ぶデザインパターン入門 の第11章を参考にしました。
Compositeパターンとは
本書には以下のように記載されています。
Compositeパターンを説明するために、コンピュータのファイルシステムを例とします。
ファイルシステム
ファイルシステムには、「ディレクトリ」というものが存在します。 そのディレクトリの中には、ファイルや別のディレクトリ(サブディレクトリ)が入っています。 つまり、ディレクトリは「入れ子」のような再帰的な構造をしています。 このディレクトリとファイルは異なるものですが、どちらも「ディレクトリのなかに入れることができるもの」であるので、 ディレクトリとファイルを同じ種類のものと見なす(同一視する)ことができます。
上記の例では、ディレクトリは、サブディレクトリやファイルを入れる「容器」であり、 ファイルは「中身」として、「容器」と「中身」を同一視することで再帰的な構造を実現しています。 このようなデザインパターンをCompositeパターンといいます。
実装
こちらを参考にしてください。
登場人物
Leaf役(Fileクラス)
「中身」を表す。
Composite役(Directoryクラス)
「容器」を表す。
Component役(Entryクラス)
Leaf役とComposite役を同一視するための役
Client役(Mainクラス)
Compositeパターンの利用者
実装のポイント
- Entryクラスには、引数なしのprintListメソッドと引数ありのprintListメソッドが2つあります。 これをprintListメソッドの多重定義といい、メソッドを呼び出すときの引数の型に応じて、適切なメソッドが実行されます。
- FileクラスのprintListメソッドでは、
System.out.println(prefix + "/" + this)
という記述があります。 ここでのthis
のように文字列としてオブジェクトを加えると、自動的にそのオブジェクトのtoStringメソッドが呼び出されます (Java言語の仕様)。
Compositeパターンのメリット
「容器」と「中身」を同一視するということは、単数と複数を同一視するということです。 これは、Client役のようなCompositeパターンを利用する役からしたら、 いちいち中身を意識する必要がないということです。