Template Method パターン

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動: 案内検索

Template Method パターン(テンプレート・メソッド・パターン)とは、GoF(Gang of Four; 4人のギャングたち)によって定義されたデザインパターンの1つである。「振る舞いに関するパターン」に属する。Template Method パターンの目的は、ある処理のおおまかなアルゴリズムをあらかじめ決めておいて、そのアルゴリズムの具体的な設計をサブクラスに任せることである。そのため、システムのフレームワークを構築するための手段としてよく活用される。

クラス図[編集]

以下に Template Method パターンのクラス図を挙げる。

AbstractClass は、public で宣言された templateMethod() と protected で宣言されたいくつかの抽象メソッドを持つ。ConcreteClass は AbstractClass を継承し、AbstractClass で定義されている抽象メソッドを実装する。

AbstractClass で定義されている抽象メソッドの可視性が protected なのは、このメソッドが AbstractClass#templateMethod() 内でのみ使用されることを想定しているからである。

利用例[編集]

以下にTemplate Method パターンを使って文字列型配列をリストアップするJavaプログラムの例を示す。 なお、このソースコードは可読性のために Java SE 5 以降で採用された「拡張for文」という構文が使用されているため [1] J2SE 1.4 以前のバージョンでは動作しない。

abstract class StringLister {
    abstract String formatHeader();
    abstract String formatItem(String item);
    abstract String formatFooter();
    final String display(String[] items) {
        StringBuilder result = new StringBuilder(this.formatHeader());
        for(String item : items) result.append(this.formatItem(item));
        result.append(this.formatFooter());
        return result.toString();
    }
}
 
class PlainTextStringLister extends StringLister{
    String formatHeader(){
        return "";
    }
    String formatItem(String item){
        return " - " + item + "\r\n";
    }
    String formatFooter(){
        return "";
    }
}
 
class HtmlStringLister extends StringLister{
    String formatHeader(){
        return "<ul>\r\n";
    }
    String formatItem(String item){
        return "  <li>" + item + "</li>\r\n";
    }
    String formatFooter(){
        return "</ul>\r\n";
    }
}
 
public class TemplateMethodTest{
    public static void main(String[] argv){
        String[] items = {"First", "Second", "Third"};
        StringLister l1 = new PlainTextStringLister();
        StringLister l2 = new HtmlStringLister();
        System.out.println(l1.display(items));
        System.out.println(l2.display(items));
    }
}

このサンプルを実行すると、次の実行結果が得られる。最初の3行が PlainTextStringLister#display() の返り値で、空行を挟んでその後にある出力が HtmlStringLister#display() の返り値である。

 - First
 - Second
 - Third

<ul>
  <li>First</li>
  <li>Second</li>
  <li>Third</li>
</ul>

参考までに、クラス図との対応関係を示す。

AbstractClass
StringLister
AbstractClass#templateMethod()
StringLister#display()
ConcreteClass
PlainTextStringLister,HtmlStringLister

関係するパターン[編集]

Factory Method パターンは、内部に Template Method パターンを包含することが多い。

関連項目[編集]

脚注[編集]

[ヘルプ]
  1. ^ 拡張for文を使わなくても同等のプログラムを書くことは出来る。