デザインパターンの一つ、Template Methodパターンを勉強してみました。
今回はQtとC++を使って、不思議なGUIアプリを作ってみました。
文字通りテンプレートを使う場合と同じ考え方だね
Template Methodパターンとは
たい焼きとたい焼き機を想像してみてください。
たい焼き機はたい焼きの形をしており、その中にさまざまな具材を入れることで、いろんな味のたい焼きができあがりますよね。
つまり、たい焼き機はテンプレートのような役割をしていて、本パターンもこの考え方を持ちます。
テンプレートのスーパークラスを用意して、そのテンプレートを利用するサブクラスがいる、といった感じです。
クラス図
たい焼き機がAbstractClassで、数あるたい焼きの作り方の工程を仮想関数として定義し、ConcreteClassでそれをオーバーライドします。
例えば、中のメインの具材関数()や、トッピング関数()など。
これらのたい焼きを作成する工程は、templateMethod()
に記述されます。こうすることで、常にたい焼き機は決まった作成手順を実行することが保証されます。
作成したアプリ
うさぎ、猫とクマがそれぞれオリジナルのスープを調理するアプリを作成しました。
スープの具材を入れる手順は以下とし、常にこの手順で実行されるとします。
- 肉を入れる
- 野菜を入れる
- スープストックを入れる
コードと実行結果
左のうさぎから、以下のようなテーブルとなっています。
うさぎ | 猫 | クマ | |
肉 | 大豆ミート | さかな | 鹿肉 |
野菜 | にんじん | わかめ | キャベツ |
スープストック | コンソメ | あごだし | はちみつ |
ちょっとよくわからないテーブルだけど、やりたいことはわかるはず
コードを分解
では、各クラスの説明をしていきます。
mainwindow.h / mainwindow.cpp
ここでは、UI部分の実装やロジックを入れています。
cook.h / cook.cpp
クラス図でいうAbstractクラスの役割をします。
cookSoup()
関数で、スープの作り方の関数を順番通りに呼び出すことで、ウサギ、猫、クマが何を具材として入れようと必ず決まった手順でスープが作られるようにします。
rabbit.h / rabbit.cpp
ウサギ、猫、クマはクラス図でいうConcereteクラスを実装しなくてはいけませんが、そのうちのウサギクラスになります。
野菜、肉、ストックに入れるものが定義されています。
どういう時に使うのか?
たい焼きの例のように、作業手順は決まっていてほしいけど、それ以外は自由といったことに使えるのかなと思いました。
つまり、テンプレートがあると便利な構造のもの、にはこの手法が使えるんですかね。
ふんわりとしています
まとめ
Template Methodパターンをアプリ作成してまとめてみました。
使いどきは、テンプレートを使うように同じようなものを大量に管理する必要があるとき、でも作業手順は順番が決まっていてほしいときに使えるのかなと思いました。
クラス図もすっきりしているので、わりと綺麗にコードの構造を保てるのかもしれません。
他のデザインパターンについてはこちらをご覧ください。
参考サイト
にほんブログ村に参加しております!よろしければクリックお願いします 🙂
にほんブログ村
コメント