デザインパターン TemplateMethod:具体的な処理をサブクラスに任せる

概要

親クラスで処理の枠組み(テンプレート)を提供する
子クラスではテンプレートを変更できない

クラス図

抽象クラス

public abstract class AbstractDisplay {
 子クラスで変更可能な処理
 protected abstract void open();
 protected abstract void print();
 protected abstract void close();
 
 templateMethod
 子クラスで共用の処理(変更不可)
 public final void display(){
  this.open();
  for (int i=0; i<5; i++) {
   this.print();
  }
  this.close();
 };
}

具象クラス

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(this.ch);
 }
 @Override
 public void close() {
  System.out.println(">>");
 }
}

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() {
  this.printLine();
 }
 @Override
 public void print() {
  System.out.println("|" + string + "|");

 }
 @Override
 public void close() {
  this.printLine();
 }
 private void printLine() {
  System.out.print("+");
  for (int i=0; i<this.width; i++) {
   System.out.print("-");
  }
  System.out.println("+");
 }
}

利用クラス

public class Program {
 public static void main(String[] args) {
  AbstractDisplay d1 = new CharDisplay('H');
  AbstractDisplay d2 = new StringDisplay("Hello");
  AbstractDisplay d3 = new StringDisplay("こんにちは");

  d1.display();
  d2.display();
  d3.display();
 }
}

結果
<<HHHHH>>
+-----+
|Hello|
|Hello|
|Hello|
|Hello|
|Hello|
+-----+
+---------------+
|こんにちは|
|こんにちは|
|こんにちは|
|こんにちは|
|こんにちは|
+---------------+