Compositeパターン

2020/10/24 00:53

GoFのCompositeパターンについて動画でわかりやすく解説しています。オブジェクトの親子関係がある場合に、親子それぞれに共通のインターフェースを持たせる事で、利用側に親子構造を意識させない形が実現できます。多くはツリー構造が発生するところでよく用いられますが、そこまで階層が深い構造でなくともメリットのある事もテキストで示しました。19分弱の動画です。

Compositeパターンとは

「個々のオブジェクト( Leaf Class )」と「オブジェクトを合成したもの( Composite Class )」を同じように扱いたい場合、親子のインターフェース( Component Interface )を同一にしてその差異を隠匿します。親子間の差異が無くなり、いくつもの親子の入れ子が木構造になることが多いです。

どういう時に効果的か

  • 親子の構造が発生する可能性があるけれども、それを利用するクラス側から意識させたくない場合
  • 木構造が発生して親の操作を子でも同様に処理したい場合

動画の中でも話していましたが、Draw系のツールを作ろうとすると、描画や拡大縮小のようなメソッドを持つインターフェースを共通に作り、各描画用オブジェクトやグループ化オブジェクトをを同じ操作で扱いたくなります。さらにユーザー操作でこの木構造は動的に増えていく為、Compositeパターンを適用しておくと扱いやすくなる事が想像できるでしょう。

また、ディレクトリやファイルの構造がツリーになることは多いので、それらを一様に操作したい場合に検討すると良いかもしれません。

自然に適用されるケース

当初単一の概念だと思ってインターフェースを作成していたが、途中から合成して行う処理であった事が判明したような場合には、後からこのパターンを適用する事で影響範囲を抑えて柔軟に対応できる事があります。リファクタリングしているエントリでは順序は違いますがこれに近い形を推察できると思います。

この記事を書いた人

佐藤 正志

サークルアラウンド株式会社 代表取締役