Template Method パターン
Tepmalte Method とは?
Template Method パターンは GoF デザインパターンの一種であり、処理の枠組みを上位クラスで決めておき、具体的な実装を下位クラスに任せる設計手法である。
Template Method パターンの特徴は以下の通り。
- 処理内容をサブクラスに記述して欲しいメソッドを abstract にて定義。
- 処理内容に変更がないメソッドは final にて定義。
簡単な例
まずは、テンプレートとなる上位クラスを実装する。
package knowledgefort.labo.oo.templatemethod; /** * @author おやつ丸 */ abstract class Profile { /** * 名前を取得します。実装はサブクラスで行います。 * * @return 名前 */ abstract String getName(); /** * 住所を取得します。実装はサブクラスで行います。 * * @return 住所 */ abstract String getAddress(); /** * 趣味を取得します。実装はサブクラスで行います。 * * @return 趣味 */ abstract String getHobby(); /** * プロフィールを取得します。 */ final String profile() { StringBuilder _builder = new StringBuilder(); _builder.append("名前は"); _builder.append(this.getName()); _builder.append("です。\n"); _builder.append(this.getAddress()); _builder.append("に住んでいます。\n"); _builder.append("趣味は"); _builder.append(this.getHobby()); _builder.append("です。\n\n"); return _builder.toString(); } }
上記はプロフィールを出力するだけの簡単なクラス。
profile() メソッドから呼び出される getName()、getAddress()、getHobby() の各メソッドは abstract で定義され、実装をサブクラスに任せている。処理の流れを記述した profile() メソッドはオーバライドさせたくないので final で定義。
使用者は上記クラスを継承し、各自で abstract メソッドをオーバライドする。
例その1
package knowledgefort.labo.oo.templatemethod; /** * @author miyako */ class MiyakoProfile extends Profile { @Override String getName() { return "ミヤコ"; } @Override String getAddress() { return "世田谷区"; } @Override String getHobby() { return "家庭菜園"; } }
例その2
package knowledgefort.labo.oo.templatemethod; /** * @author nao */ class NaoProfile extends Profile { @Override String getName() { return "ナオ"; } @Override String getAddress() { return "文京区"; } @Override String getHobby() { return "料理"; } }
上記を実行してみる。
… System.out.println(new MiyakoProfile().profile()); System.out.println(new NaoProfile().profile()); …
結果は以下の通り。
名前はミヤコです。 世田谷区に住んでいます。 趣味は家庭菜園です。 名前はナオです。 文京区に住んでいます。 趣味は料理です。