開発
Compositeパターン
makuta
コンピュータのファイルシステムには、「ディレクトリ」というものがあります。ディレクトリの中にはファイルが入っていたり別のディレクトリ(サブディレクトリ)が入っていたりします。そしてまた、そのサブディレクトリの中に他のファイルやサブファイルが入っていることもあります。ディレクトリはそのような「入れ子」になった構造、再帰的な構造を作り出しています。さて、ディレクトリとファイルは異なるものですが、このどちらも「ディレクトリの中に入れることができる」ですね。ディレクトリとファイルをまとめて「ディレクトリエントリ」と呼ぶこともあります。ディレクトリエントリという名前によって、ディレクトリとファイルを同じ種類のものであると見なしている(同一視している)のです。
例えば、あるディレクトリの中に何かがあるかを順に調べていくとしましょう。そこで順に見ていくものは、サブディレクトリかもしれないし、ファイルかもしれません。一言で言えば、「ディレクトリエントリというもの」を順に見ているのです。
ディレクトリとファイルをまとめてディレクトリエントリとして扱うように、容器と中身を同じ種類のものとして扱うと便利な場合があります。容器の中には中身を入れてもいいですし、さらに小さな容器を入れることもできます。そして、その小さな容器の中にもっと小さな容器を入れることもできます。そして、その小さな容器の中にもっと小さな容器を、、、このようにして、入れ子になった構造、再帰的な構造の取り扱いを容易にするのが、Compositeパターンです。例えば、あるフォルダ以下のファイルやフォルダをすべて削除したい場合など、それがファイルなのかフォルダなのかを意識せずに、同じように削除できたほうが都合が良いでしょう。
GofでのCompositeパターンの定義は
部分ー全体階層を表現するために、オブジェクトを木構造に組み立てる。Compositeパターンにより、クライアントは、個々のオブジェクトとオブジェクトを合成したものを一様に扱うことができるようになる。
です。
Compositeパターンはオブジェクトの構造に注目したパターンで、単体のオブジェクトとオブジェクトの集合を同一視するためのパターンです。その際、オブジェクトを木構造に組み立てるのが特徴です。
この木構造は、ファイルシステムのディレクトリツリーをイメージするとよくわかります。逆さにすると、枝葉が伸びるような形になっていますね。
Compositeパターンでは、親子関係を持つオブジェクトを再帰的に保持することで、木構造を組み立てます。また、任意の枝の部分や末端の葉の部分に対して、共通の手順でアクセスできるような仕組みを提供しています。つまり、単一のオブジェクトにも、複数のオブジェクトから形成されたオブジェクトにも、同じ手順でアクセスできるAPIを提供します。
ということで、容器と中身を同一視し、再帰的な構造を形作るCompositeパターンについてでした。