kakke18’s blog

ゆるふわ学生エンジニア

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パターンを利用する役からしたら、 いちいち中身を意識する必要がないということです。

まとめ

Compositeパターンとは、「容器」と「中身」を同一視し、再帰的な構造を形作るデザインパターンである。