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

template-method-e プログラミング

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

デザインパターンの一つ、Template Methodパターンを勉強してみました。

今回はQtとC++を使って、不思議なGUIアプリを作ってみました。

文字通りテンプレートを使う場合と同じ考え方だね

Template Methodパターンとは

たい焼きとたい焼き機を想像してみてください。

fishcakeex

たい焼き機はたい焼きの形をしており、その中にさまざまな具材を入れることで、いろんな味のたい焼きができあがりますよね。

つまり、たい焼き機はテンプレートのような役割をしていて、本パターンもこの考え方を持ちます。

テンプレートのスーパークラスを用意して、そのテンプレートを利用するサブクラスがいる、といった感じです。

クラス図

template-method-diagram
Template Methodパターン https://ja.wikipedia.org/wiki/Template_Method_%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3

たい焼き機がAbstractClassで、数あるたい焼きの作り方の工程を仮想関数として定義し、ConcreteClassでそれをオーバーライドします。

例えば、中のメインの具材関数()や、トッピング関数()など。

これらのたい焼きを作成する工程は、templateMethod()に記述されます。こうすることで、常にたい焼き機は決まった作成手順を実行することが保証されます。

作成したアプリ

うさぎ、猫とクマがそれぞれオリジナルのスープを調理するアプリを作成しました。

スープの具材を入れる手順は以下とし、常にこの手順で実行されるとします。

  1. 肉を入れる
  2. 野菜を入れる
  3. スープストックを入れる

コードと実行結果

template-method-app-gif
実行結果
GitHub - jiji-thecat/dp-template-method
Contribute to jiji-thecat/dp-template-method development by creating an account on GitHub.

左のうさぎから、以下のようなテーブルとなっています。

うさぎクマ
大豆ミートさかな鹿肉
野菜にんじんわかめキャベツ
スープストックコンソメあごだしはちみつ

ちょっとよくわからないテーブルだけど、やりたいことはわかるはず

コードを分解

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

mainwindow.h / mainwindow.cpp

ここでは、UI部分の実装やロジックを入れています。

cook.h / cook.cpp

クラス図でいうAbstractクラスの役割をします。

cookSoup()関数で、スープの作り方の関数を順番通りに呼び出すことで、ウサギ、猫、クマが何を具材として入れようと必ず決まった手順でスープが作られるようにします。

rabbit.h / rabbit.cpp

ウサギ、猫、クマはクラス図でいうConcereteクラスを実装しなくてはいけませんが、そのうちのウサギクラスになります。

野菜、肉、ストックに入れるものが定義されています。

どういう時に使うのか?

たい焼きの例のように、作業手順は決まっていてほしいけど、それ以外は自由といったことに使えるのかなと思いました。

つまり、テンプレートがあると便利な構造のもの、にはこの手法が使えるんですかね。

ふんわりとしています

まとめ

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

使いどきは、テンプレートを使うように同じようなものを大量に管理する必要があるとき、でも作業手順は順番が決まっていてほしいときに使えるのかなと思いました。

クラス図もすっきりしているので、わりと綺麗にコードの構造を保てるのかもしれません。

他のデザインパターンについてはこちらをご覧ください。

参考サイト

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

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

コメント

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