【GoF】Template Methodパターン
ポイント
AbstractDisplay.java テンプレートクラス
public abstract class AbstractDisplay { // 抽象メソッドを持つため、abstract class // テンプレートメソッド public final void display() { // finalで継承不可 // テンプレートメソッド内で抽象メソッドを呼び出し、全体のアルゴリズムを記述 // ⇒変わらないものとして、全体のアルゴリズムを定義 open(); for (int i = 0; i < 5; i++) { print(); } close(); } // 抽象メソッド定義 // ⇒変わるものを抽象メソッドとして切り出す // ⇒サブクラスで抽象メソッドを定義させる public abstract void open(); public abstract void print(); public abstract void close(); }
CharDisplay.java サブクラス
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(">>"); } }
StringDisplay.java サブクラス
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("+"); } }
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(); } }