英語で「複合物」を意味する言葉です。パターンは、「容器と中身を同一視する」ことで、再帰的な構造の取り扱いを容易にするものです。「容器と中身を同一視する」必要が生じる例として、ファイルシステムなどが挙げられます。あるフォルダ以下のファイルやフォルダをすべて削除したい場合など、それがファイルなのかフォルダなのかを意識せずに、同じように削除できたほうが都合が良いでしょう。サンプルケースサンプルケースでは、ディレクトリとファイルを考えます。パターンを意識せずに、ファイルとディレクトリを表すクラスを作成してみましょう。メソッドが呼ばれると、「〜を削除しました」とだけ表示するものとします。保持しているオブジェクトをすべて削除してから、自らを削除するものとします(ここでは、「〜を削除しました」と表示するだけ)。メソッドを呼び出すようにしています。上記の2つのファイルを使って、以下のようなファイル構造を記述して、削除してみましょう。実行結果は、以下のようになります。file1を削除しましたfile2を削除しましたfile3を削除しましたdir2を削除しましたfile4を削除しましたdir1を削除しました問題なく動作しているようですね。めでたしめでたしです。パターンなんて必要ないじゃないですか」と思ってしまいます。ところがここで、「ディレクトリには、ディレクトリとファイルだけでなくシンボリックリンクも入るようにしたい」という要求が出てきました。対応できるようにしなければなりません。パターンを利用しておかなかったのか」と。パターンを利用して上記のファイル構造を記述していればどうなっていたでしょう。パターンでは、容器の中身と入れ物を同一視します。同一視するために、容器と中身が共通のインタフェースを実装するようにします。実装するようにしましょう。メソッドのみを定義しています。クラスを実装すると、以下のようになります。オブジェクトとして扱うことができるようになっています。容器と中身を同一視している状態です。クラスのソースコードを修正する必要もありません。クラスを実装すればよいのです。パターンを利用することで、再帰的な構造の記述が容易になり、メンテナンス性も向上していることがわかるでしょう。パターンの一般的なクラス図は以下のようになります。Textを触ってみた。