Compositeパターンを使って簡単なアプリを作ってみた

composite-e プログラミング

※当ブログでは商品・サービスのリンク先にプロモーションを含みます。ご了承ください。

デザインパターンの一つ、CompositeパターンをQtとC++を使って勉強してみました。

実際にアプリを作ってみることで、パターンの使い方を学びたいと思います。

正直使い勝手がよくわかってませんが、一応作ったので書き残しておきます。

Compositeパターンとは

いろいろとググってみたのですが、木構造を伴う再帰的なデータ構造を表すことが可能らしいです。

なので、よく出てくるサンプルはディレクトリとファイルを再帰的に削除するものが多いですね。

クラス図

composite-diagram
https://ja.wikipedia.org/wiki/Composite_%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3

ComponentクラスをLeaf, Compositeクラスは継承します。

そして、菱形の矢印の意味は、集約なので、ComponentクラスはCompositeクラスの一部という意味になります。

作成したアプリ

マトリョーシカに入る猫を追加していき、それを最後削除するアプリを作りました。

作成したあとに気づいたのですが、これはまったく再帰していなくて、Compositionパターンを活用できていないと思います。

毎度しょうもないです・・・

コードと実行結果

composite-gif
実行結果

Add Catボタンを押すことで、マトリョーシカに入る少し小さめの招き猫が次々生成されていきます。

そして、Removeボタンを押すと、追加していった招き猫がすべて消えます。

GitHub - jiji-thecat/dp-composite
Contribute to jiji-thecat/dp-composite development by creating an account on GitHub.

コードを分解

では、各クラスの説明をしていきます。

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関数が呼ばれることで、このmatListCatクラスのオブジェクトが追加されていきます。

イメージでいうと、マトリョーシカに入る小さいサイズの招き猫が配列に追加されていく感じです。

catToMatList-diagram

そして、remove関数が呼ばれると、matList配列からそれぞれのCatオブジェクトのremove関数を呼び出して、削除処理が走ります。

どういう時に使うのか?

再帰構造を実装しなくてはいけないときに役立つパターンですかね。

再帰がでてきたら思い出そう

まとめ

Compositeパターンのアプリを作成してまとめてみました。

再帰構造がでてきたときには、このパターンを思い出したいと思います。

参考サイト

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

にほんブログ村 IT技術ブログへ
にほんブログ村

コメント

タイトルとURLをコピーしました