Compositeパターン:木構造のデータを扱うデザインパターンをクラス図にまとめる

デザインパターン

Compositeパターン

Compositeパターンは、木構造のデータを扱う際に便利なデザインパターンです。
自分なりにCompositeパターンをクラス図にまとめてみました。

Compositeパターンのクラス図

Compositeパターンのクラス図

Compositeパターンのクラス図

Compositeパターンの解説

Compositeパターンは、木構造のオブジェクトを操作する際に、そのデータが木構造の「葉」の部分(そのオブジェクトがさらに別の「枝」や「葉」のオブジェクトを持たない状態)であるか、「枝」の部分(そのオブジェクトが、「枝」か「葉」のデータを保持する状態)かを意識せずに、単一のメソッドを呼び出すことで、「枝」「葉」各々の処理を実行できるようにするパターンである。

よく使われるのはディレクトリ構造である。ディレクトリが「枝」、ファイルが「葉」にあたる。
それ以外にも、例えば「組織」と「社員」、「単元」と「問題」、のような末端のオブジェクトと、それを内包するオブジェクトが別の型であるような場合に使用できる。

図でいうと、Compositeが「枝」、Leafが「葉」にあたる。この2つの親クラスとしてComponentクラスを定義する。このComponentは図では抽象クラスで定義しているが、インターフェースとしても構わない。「枝」「葉」の共通の型になっていることがポイント。

Compositeは自分の配下にさらにComponent型のオブジェクトを包含する関係ももつため、その要素を追加・削除・取得するようなメソッド(図ではadd,remove,getChild)を持たせる。

operationメソッドは例えば先ほどのディレクトリ構造の例であれば、Compositeクラスの方は自分の持つComponentオブジェクトのoperationを呼び出す処理、Leafクラスの方は自分のファイル名を表示する処理、をそれぞれ実装しておけば、ディレクトリとファイルの一覧を木構造で表示することができる。

PlantUMLでCompositeパターンのクラス図を記述する

文頭のCompositeパターンのクラス図をPlantUMLで書いたときのソースです。

@startuml Composite
abstract class Component{
  + abstract operation() 
}
class Composite extends Component{
  - children: Component
  --
  + operation()
  + add()
  + remove()
  + getChild()
}
class Leaf extends Component{
  + operation()
}
Composite "1" -u- "0..*" Component
@enduml

参考サイトURL

Composite パターン – Wikipedia
PHPによるデザインパターン入門 – Composite〜木構造を表す