###ざっくりTemplate Method
スーパークラスで処理の枠組みを定め、サブクラスでその具体的内容を定めるようなデザインパターンをTemplate Methodという。
登場役はAbstractClass(抽象クラス)の役とConcreteClass(具象クラス)の役の2役。
###AbstractClass(抽象クラス)の役
AbstractClass役はテンプレートメソッドを実装する。
また、そのテンプレートメソッドで使っている抽象メソッドを宣言する。
package templateMethod;
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();
}
}
###ConcreteClass(具象クラス)の役
AbstractClass役で定義されている抽象メソッドを具体的に実装する。
ここで実装したメソッドはAbstract役のテンプレートメソッドから呼び出される。
package templateMethod;
public class CharDisplay extends AbstractDisplay {
private char ch;
public CharDisplay(char ch) {
this.ch = ch;
}
@Override
public void open() {
System.out.print("<<");
}
@Override
public void print() {
System.out.print(ch);
}
@Override
public void close() {
System.out.println(">>");
}
}
package templateMethod;
public class StringDisplay extends AbstractDisplay{
private String string;
private int width;
public StringDisplay(String string) {
this.string = string;
this.width = string.getBytes().length;
}
@Override
public void open() {
printLine();
}
@Override
public void print() {
System.out.println("|" + string + "|");
}
@Override
public void close() {
printLine();
}
private void printLine() {
System.out.print("+");
for (int i = 0; i < width; i++) {
System.out.print("-");
}
System.out.println("+");
}
}
###呼び出し元
package templateMethod;
public class Main {
public static void main(String[] args) {
AbstractDisplay cd = new CharDisplay('c');
cd.display();
AbstractDisplay sd = new StringDisplay("Hello,World");
sd.display();
}
}
//結果
//<<ccccc>>
//+-----------+
//|Hello,World|
//|Hello,World|
//|Hello,World|
//|Hello,World|
//|Hello,World|
//+-----------+
###ロジックの共通化
Template Methodパターンを使うと、ロジックを共通化することができる。
今回のサンプルでは、スーパークラスのテンプレートメソッドにアルゴリズムが記述されているため、サブクラス側ではアルゴリズムをいちいち記述する必要がなくなる。
Template Methodを使わずコピペで複数のConcreteClassを作成した場合、
後にConcreteClassでバグが見つかった場合、全てのConcreteClassにバグの修正を行う必要がある。
Template Methodパターンを使用している場合、テンプレートメソッドにバグが見つかった場合でも
テンプレートメソッドさえ修正すれば良いということになる。
こちらを参考にさせていただきました。
増補改訂版Java言語で学ぶデザインパターン入門