デザインパターンの一つ、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パターンのアプリを作成してまとめてみました。
再帰構造がでてきたときには、このパターンを思い出したいと思います。
他のデザインパターンについてはこちらをご覧ください。
参考サイト
にほんブログ村に参加しております!よろしければクリックお願いします 🙂
にほんブログ村
コメント