テンプレートメソッドパターン

📢 この記事は gemini-2.5-flash によって翻訳されました

Template Method Pattern クラスの振る舞いパターン

目的

ある操作のアルゴリズムの骨格を定義し、一部のステップはサブクラスに任せる。テンプレートメソッドを使うと、サブクラスはアルゴリズムの構造を変えずに、その特定のステップを再定義できるようになるんだ。

構造

テンプレートメソッドパターン

ここで、

  • AbstractClass (抽象クラス) 抽象的なプリミティブ操作を定義する。具体的なサブクラスは、アルゴリズムの各ステップを実装するためにこれらを再定義するんだ。テンプレートメソッドを実装し、アルゴリズムの骨格を定める。このテンプレートメソッドは、プリミティブ操作だけでなく、AbstractClassや他のオブジェクトで定義された操作も呼び出すよ。
  • ConcreteClass (具象クラス) プリミティブ操作を実装し、アルゴリズム内の特定のサブクラスに関連するステップを完了させる。

適用性

テンプレートメソッドパターンが役立つのは、こんな時だよ。

  • アルゴリズムの変わらない部分を一度だけ実装して、変わる可能性のある振る舞いはサブクラスに任せたい時。
  • 各サブクラスで共通の振る舞いがあるなら、コードの重複を避けるために共通の親クラスに抽出して集約すべきだね。
  • サブクラスの拡張を制御したい時。テンプレートメソッドは、特定のポイントで「フック」操作(デフォルトの振る舞いで、サブクラスが必要に応じて再定義して拡張できるもの)を呼び出すように設計されてる。これで、これらのポイントでしか拡張できないように制限できるんだ。

学校に行く例で見てみよう。生徒は授業を受けたり、宿題をしたりする。先生は授業を教えたり、宿題を採点したりするよね。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
public class TemplateMethodPattern {
    public static void main(String[] args) {
        Person stu = new Student();
        Person tec = new Teacher();

        stu.TemplateMethod();
        System.out.println("==========");
        tec.TemplateMethod();
    }
}

abstract class Person{
    public void TemplateMethod(){
        System.out.println("go to class");
        PrimitiveOperation1();
        System.out.println("End of class");
        PrimitiveOperation2();
    }

    public abstract void PrimitiveOperation1(); // プリミティブ操作1:授業:生徒は聞く;先生は教える
    public abstract void PrimitiveOperation2(); // プリミティブ操作2:宿題:生徒はする;先生は採点する
}

class Student extends Person{
    @Override
    public void PrimitiveOperation1(){
        System.out.println("Listen");
    }

    public void PrimitiveOperation2(){
        System.out.println("Do assignments");
    }
}

class Teacher extends Person{
    @Override
    public void PrimitiveOperation1(){
        System.out.println("Teach");
    }

    public void PrimitiveOperation2(){
        System.out.println("Grade assignments");
    }
}

Visits Since 2025-02-28

Hugo で構築されています。 | テーマ StackJimmy によって設計されています。