【コンポジットパターン】

Compositeパターン とは?

💡 葉っぱも枝も同じ「木の一部」として扱う設計術
📌 このページのポイント
Compositeパターン:ツリー構造の統一操作 Component (共通インターフェース) Leaf (末端要素・ファイル等) Composite (コンテナ・ディレクトリ等) file.txt image.png subdir/ Client 同じ操作で呼べる getSize() / draw() などを統一して呼べる
Compositeパターン:LeafとCompositeを共通インターフェースで操作
ひよこ ひよこ

Compositeパターンって、何を解決するためのパターンなの?

ペンギン先生 ペンギン先生

ツリー構造を扱うときに、葉っぱ(単一要素)と枝(コンテナ)を別々に扱うコードが煩雑になる問題を解決するんだよ。同じ操作を統一的にできるようにするんだ。

ひよこ ひよこ

ファイルシステムで説明してもらえる?

ペンギン先生 ペンギン先生

ファイルとディレクトリがあるよね。ディレクトリはファイルを含めるし、さらにディレクトリも含められる。Compositeパターンを使うと「getSize()」という操作をファイルにもディレクトリにも同じように呼べるんだ。ディレクトリの場合は中身を再帰的に合算するんだよ。

ひよこ ひよこ

3つの要素って何なの?

ペンギン先生 ペンギン先生

Component(共通インターフェース)、Leaf(ファイルみたいな末端)、Composite(ディレクトリみたいなコンテナ)だよ。クライアントはComponentとして扱うだけだから、中がLeafかCompositeかを意識しなくていいんだ。

ひよこ ひよこ

UIでも使われるって聞いたよ?

ペンギン先生 ペンギン先生

そうだよ。ボタンやテキストが「Leaf」、パネルやウィンドウが「Composite」として扱えるんだ。「draw()」を呼べば自動的に子要素も再帰的に描画されるように設計できるんだよ。

ひよこ ひよこ

再帰的に処理できるのが便利なんだね!注意点はある?

ペンギン先生 ペンギン先生

全要素が同じインターフェースを持つので、LeafにはCompositeの操作(子を追加するなど)が不要でも実装しなければならないケースがあるんだ。設計のトレードオフとして覚えておくといいよ。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「Compositeパターン」って出てきたら「ツリー構造を統一インターフェースで扱う設計」と思えればだいたいOK!
📖 おまけ:英語の意味
「Composite Pattern」 = 合成パターン
💬 Composite(合成・複合)はラテン語のcompositus(組み合わせたもの)が語源で、GoFの「Design Patterns」(1994年)で定義された構造パターンの一つだよ。
← 用語集にもどる