Template Method パターン (スーパークラスで処理の流れを定義し, その処理の詳細はサブクラスで定義する)

[Template] とは, [プラスチック板に文字, 図形などの外形をくるぬいた製図用具] のことを言う.

Template を利用して製図すると, 枠組みが同じ文字, 図形を作成できる. ただ, どんな筆記具で製図するか, どんな色で製図するか等により, できあがりの見栄えあ変わってくる. つまり, [Template Method パターン] とは, 処理手順の枠組みを提供するパターン.

具体的には, スーパークラスで処理手順の枠組みを決め, その手順で利用するメソッドを抽象メソッドで定義しておく. そしてその抽象メソッドを, サブクラスで実装し, 具体的な処理内容を定義するという形になる.

役割

  1. AbstractClass (抽象クラス):
テンプレートメソッドを実装する. また, テンプレートメソッドで使用するメソッド を抽象メソッドで定義する.
  1. ConcreteClass (具象クラス):
[AbstractClass] で定義した抽象メソッドを実装する. ここで実装した抽象メソッド は, [AbstractClass] のテンプレートメソッドで使用される.
  1. Client (利用者):
[Template Method] パターンを適用したクラスを利用し処理する.

クラス図

Template Method パターンのクラス図

_images/designpattern-template_method012.gif

ソースコード

  1. AbstractClass.java
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
public abstract class AbstractClass{
    /*
      [templateMethod] に [final] 修飾子を付けをオーバーライドできないようにする
      処理内容をサブクラスで変更されるのを禁止する.
    */
    public final void templateMethod(){
	method1();
	method2();
	method3();
	method4();
    }

    /*
      外部から直接アクセスさせないようにする. サブクラスでのオーバーライド
      を強制という意味を込めて [protected] にする.
    */
    protected abstract void method1();
    protected abstract void method2();
    protected abstract void method3();
    protected abstract void method4();
}
  1. ConcreteClass.java
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
public class ConcreteClass extends AbstractClass{
    public void method1(){
	System.out.println("method1");
    }

    public void method2(){
	System.out.println("method2");
    }

    public void method3(){
	System.out.println("method3");
    }

    public void method4(){
	System.out.println("method4");
    }
}
  1. Client.java
1
2
3
4
5
6
public class Client{
    public static void main(String[] args){
	AbstractClass ac = new ConcreteClass();
	ac.templateMethod();
    }
}

上記のプログラムの実行結果:

[wtopia TemplateMethod]$ java Client
method1
method2
method3
method4