Template Method パターン
From Wikipedia, the free encyclopedia
クラス図
以下に Template Method パターンのクラス図を挙げる。

AbstractClass で定義されている抽象メソッドの可視性が protected (#) なのは、このメソッドが AbstractClass.templateMethod() 内でのみ使用されることを想定しているからである。
利用例
以下にTemplate Method パターンを使って文字列型配列を書式化してリストアップするJavaプログラムの例を示す。
abstract class StringLister {
protected abstract String formatHeader();
protected abstract String formatItem(String item);
protected abstract String formatFooter();
public 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 {
protected String formatHeader() {
return "";
}
protected String formatItem(String item) {
return " - " + item + "\r\n";
}
protected String formatFooter() {
return "";
}
}
class HtmlStringLister extends StringLister {
protected String formatHeader() {
return "<ul>\r\n";
}
protected String formatItem(String item) {
return " <li>" + item + "</li>\r\n";
}
protected 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 パターンを包含することが多い。