デザインパターンの一つ、CompositeパターンをQtとC++を使って勉強してみました。
実際にアプリを作ってみることで、パターンの使い方を学びたいと思います。

正直使い勝手がよくわかってませんが、一応作ったので書き残しておきます。
Compositeパターンとは
いろいろとググってみたのですが、木構造を伴う再帰的なデータ構造を表すことが可能らしいです。
なので、よく出てくるサンプルはディレクトリとファイルを再帰的に削除するものが多いですね。
クラス図

ComponentクラスをLeaf, Compositeクラスは継承します。
そして、菱形の矢印の意味は、集約なので、ComponentクラスはCompositeクラスの一部という意味になります。
作成したアプリ
マトリョーシカに入る猫を追加していき、それを最後削除するアプリを作りました。
作成したあとに気づいたのですが、これはまったく再帰していなくて、Compositionパターンを活用できていないと思います。

毎度しょうもないです・・・
コードと実行結果

Add Catボタンを押すことで、マトリョーシカに入る少し小さめの招き猫が次々生成されていきます。
そして、Removeボタンを押すと、追加していった招き猫がすべて消えます。
コードを分解
では、各クラスの説明をしていきます。
mainwindow.h / mainwindow.cpp
ここでは、UI部分の実装やロジックを入れています。
matryoshka-entry.h / matryoshka-entry.cpp
クラス図でいう、Componentクラスになります。
remove関数を仮想純粋関数とすることで、継承されるクラスもremove関数を実装してもらうようにします。
cat.h / cat.cpp
クラス図でいう、Leafクラスになります。
これはサンプルアプリの追加されていく招き猫クラスですね。
MatryoshkaEntryクラスを継承しているので、remove関数を定義しています。
remove関数では自身を削除しています。
matryoshka.h / matryoshka.cpp
クラス図でいう、Compositeクラスになります。
これはサンプルアプリの一番左にある親のマトリョーシカアイコンを表しており、Catクラスを最大10個保持できるmatList配列を持っています。
add関数が呼ばれることで、このmatListにCatクラスのオブジェクトが追加されていきます。
イメージでいうと、マトリョーシカに入る小さいサイズの招き猫が配列に追加されていく感じです。

そして、remove関数が呼ばれると、matList配列からそれぞれのCatオブジェクトのremove関数を呼び出して、削除処理が走ります。
どういう時に使うのか?
再帰構造を実装しなくてはいけないときに役立つパターンですかね。

再帰がでてきたら思い出そう
まとめ
Compositeパターンのアプリを作成してまとめてみました。
再帰構造がでてきたときには、このパターンを思い出したいと思います。
他のデザインパターンについてはこちらをご覧ください。
参考サイト

にほんブログ村に参加しております!よろしければクリックお願いします 🙂
にほんブログ村



コメント