templateは日本語で「ひな形」や「定型文」という意味になる.Template Methodパターンは,オブジェクトの多態性に関する象徴的なパターンである.抽象クラスで処理の枠組みを定め,派生クラスでその具体的な処理を実装する.
Template Methodパターンの主な要素は以下である.
java// Abstract Class
abstract class Game {
abstract void initialize();
abstract void startPlay();
abstract void endPlay();
// Template Method
public final void play() {
initialize();
startPlay();
endPlay();
}
}
// Concrete Class
class Cricket extends Game {
@Override
void initialize() {
System.out.println("Cricket Game Initialized! Start playing.");
}
@Override
void startPlay() {
System.out.println("Cricket Game Started! Enjoy the game.");
}
@Override
void endPlay() {
System.out.println("Cricket Game Finished!");
}
}
class Football extends Game {
@Override
void initialize() {
System.out.println("Football Game Initialized! Start playing.");
}
@Override
void startPlay() {
System.out.println("Football Game Started! Enjoy the game.");
}
@Override
void endPlay() {
System.out.println("Football Game Finished!");
}
}
// Client
public class TemplateMethodPattern {
public static void main(String[] args) {
Game game = new Cricket();
game.play();
System.out.println();
game = new Football();
game.play();
}
}
Template Methodという名前は今回デザインパターンを勉強する中で初めて知った言葉だが,やっていること自体はこれまで自然に実装していたことで,よく使っていた.
ただ,これまでとは考え方の部分で異なる.これまではとりあえず共通する処理があったら継承するという選択を取りがちだった.しかし,疎結合なオブジェクトへの以上で十分な場合は,より制約の多い実装継承を,そうと知らずに盲信して無警戒に継承することは問題であることを今回オブジェクト指向について勉強する中で学んでいる.
まだ委譲と継承どちらを使うべきかを正しく判断できる自信はないが,どちらを使うべきか考えられるいうステージに立てたことはいいことだ.