AbstractDisplay

Template Method Pattern
S. Yukita
[email protected]
Template Method パターン
• スーパークラスにテンプレートとなるメソッドの定
義をおく。定型処理の枠組みを決める。
– テンプレートは public final で修飾される。
• テンプレートメソッドは要素的なアクションを実行
して定型処理のロジックを実現する。
– 要素アクションは抽象メソッドとしておく。
– つまり abstract protected がよいだろう。
– サブクラスではそれらの抽象メソッドを具体的に定義
する。
– これらは hook method と呼ばれる。
Template Pattern
2
例題の
クラス図
AbstractDisplay
open
print
close
display
CharDisplay
StringDisplay
open
print
close
open
print
close
Template Pattern
3
AbstractDisplay.java
public abstract class AbstractDisplay {
public abstract void open();
// サブクラスで実装
public abstract void print();
// サブクラスで実装
public abstract void close();
// サブクラスで実装
public final void display() {
// この抽象クラスで実装
open();
for (int i = 0; i < 5; i++) print();
close();
}
}
Template Pattern
4
CharDisplay.java
public class CharDisplay extends AbstractDisplay {
private char ch;
public CharDisplay(char ch) { this.ch = ch;}
public void open(){
System.out.print("<<");
}
public void print(){
System.out.print(ch);
}
public void close(){
System.out.println(">>");
}
}
Template Pattern
5
StringDisplay.java (1)
public class StringDisplay extends
AbstractDisplay {
private String string;
private int width;
public StringDisplay(String string) {
this.string = string;
this.width = string.getBytes().length;
}
Template Pattern
6
StringDisplay.java (2)
public void open() {
printLine();
}
public void print() {
System.out.println("|" + string + "|");
}
public void close() {
printLine();
}
Template Pattern
7
StringDisplay.java (3)
private void printLine() {
System.out.print("+");
for (int i = 0; i < width; i++) {
System.out.print("-");
}
System.out.println("+");
}
}
Template Pattern
8
Main.java
public class Main {
public static void main(String[] args) {
AbstractDisplay d1 = new CharDisplay('H');
AbstractDisplay d2 =
new StringDisplay("Hello, world.");
AbstractDisplay d3 =
new StringDisplay("こんにちは。");
d1.display();
d2.display();
d3.display();
}
}
Template Pattern
9
実行結果
<<HHHHH>>
+-------------+
|Hello, world.|
|Hello, world.|
|Hello, world.|
|Hello, world.|
|Hello, world.|
+-------------+
+------------+
|こんにちは。|
|こんにちは。|
|こんにちは。|
|こんにちは。|
|こんにちは。|
+------------+
Template Pattern
10
パターン
AbstractClass
method1
method2
method3
templateMethod
ConcreteClass
method1
method2
method3
Template Pattern
11
例題の
解釈
template method
AbstractDisplay
open
print
close
display
=役に伴うシナリオ
抽象的
要素的な
アクション群
役者の個性=具体的
override 不可
CharDisplay
StringDisplay
open
print
close
open
print
close
役者たち
Template Pattern
12