Dyuichi Blog

オブジェクト指向シリーズⅣ: デザインパターン [③ Template Method]

概要

templateは日本語で「ひな形」や「定型文」という意味になる.Template Methodパターンは,オブジェクトの多態性に関する象徴的なパターンである.抽象クラスで処理の枠組みを定め,派生クラスでその具体的な処理を実装する.

Template Methodパターンの主な要素は以下である.

  • Abstract Class:アルゴリズムの大枠となるテンプレートメソッドを持つ抽象クラス
  • Concrete Class:Abstract Classを継承し,アルゴリズムの一部のステップを実装する具象クラス

クラス図

画像が読み込まれない場合はページを更新してみてください。

実装例(Java)

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という名前は今回デザインパターンを勉強する中で初めて知った言葉だが,やっていること自体はこれまで自然に実装していたことで,よく使っていた.

ただ,これまでとは考え方の部分で異なる.これまではとりあえず共通する処理があったら継承するという選択を取りがちだった.しかし,疎結合なオブジェクトへの以上で十分な場合は,より制約の多い実装継承を,そうと知らずに盲信して無警戒に継承することは問題であることを今回オブジェクト指向について勉強する中で学んでいる.

まだ委譲と継承どちらを使うべきかを正しく判断できる自信はないが,どちらを使うべきか考えられるいうステージに立てたことはいいことだ.