今日の目標
JavaのTemplete Methodパターンとはどういったものなのかを知る
使うもの
ではスタート
はじめに
まずはTemplete MethodパターンとはどのようなものなのかをWikipediaさんで調べてみる。
Template Method パターン(テンプレート・メソッド・パターン)とは、GoF(Gang of Four; 4人のギャングたち)によって定義されたデザインパターンの1つである。「振る舞いに関するパターン」に属する。Template Method パターンの目的は、ある処理のおおまかなアルゴリズムをあらかじめ決めておいて、そのアルゴリズムの具体的な設計をサブクラスに任せることである。そのため、システムのフレームワークを構築するための手段としてよく活用される。(WikidediaのTemplate Method パターン)
形だけ流れを作っておいて、中で何をするかはテンプレートをextendsしたクラスにお任せする、ということらしい。今までのパターン(Iterator、Adapter)の中で一番わかりやすい気がする。
本のサンプルを参考にしてみる
このパターンを見た瞬間、「3匹の子豚か!!」とよくわからないインスピレーションを得たので、直感を利用して2匹(3匹目は勝手に省略)の子豚をソースコードにしてみた。
package kobuta;
public abstract class BuildTemplete {
abstract void design();
abstract void build();
final void construction() {
design();
for(int i=0;i<5;i++) {
build();
}
delivery();
}
abstract void delivery();
}
package kobuta;
public class Kobuta1 extends BuildTemplete {
private String material;
public Kobuta1(String material) {
this.material = material;
}
@Override
void design() {
System.out.println("パソコンを使って設計");
}
@Override
void build() {
System.out.println(material + "の発注");
System.out.println(material + "を使う");
}
@Override
void delivery() {
System.out.println("依頼者に説明して納品");
}
}
package kobuta;
public class Kobuta2 extends BuildTemplete {
private String material;
public Kobuta2(String material) {
this.material = material;
}
@Override
void design() {
System.out.println("紙で設計");
}
@Override
void build() {
System.out.println(material + "を使う");
}
@Override
void delivery() {
System.out.println("説明資料を渡して納品");
}
}
BuildTempleteが今回のTempleteの役割を担っている。
BuildTempleteは、constructionというメソッドで流れの形だけ指定している。つまりは、「建設」を依頼されたら以下のことをする、という流れを作っているだけである。
- design(設計)を1回する
- build(建てる)を5回繰り返す
- delivery(納品)を1回する
その中で何をするか、はBuildTempleteをextendsした各子豚さんに任せている。
そしてそれらを使う側は、「建設してよ」というメッセージを送るだけで、内部で何をしているのかはわからなくても「建設」に必要なことは子豚さんたちが頑張ってやってくれる、という仕組み。
package kobuta;
public class Main {
public static void main(String[] args) {
BuildTemplete bt1 = new Kobuta1("コンクリート");
BuildTemplete bt2 = new Kobuta2("木材");
System.out.println("***** Kobuta1の建設 *****");
bt1.construction();
System.out.println("***** Kobuta2の建設 *****");
bt2.construction();
}
}
結果。
***** Kobuta1の建設 *****
パソコンを使って設計
コンクリートの発注
コンクリートを使う
コンクリートの発注
コンクリートを使う
コンクリートの発注
コンクリートを使う
コンクリートの発注
コンクリートを使う
コンクリートの発注
コンクリートを使う
依頼者に説明して納品
***** Kobuta2の建設 *****
紙で設計
木材を使う
木材を使う
木材を使う
木材を使う
木材を使う
説明資料を渡して納品
子豚がわかりやすいかどうかはともかくとして、これはTemplete Methodとはお友達になれそうです。