第5回 テンプレートメソッドパターン

テンプレートメソッドパターン

言語によってその実装方法はさまざまであるが、
子クラスで差分を実装する書き方なら、

public class Main {
  public static void main(String args[]) {
    Hoge h = new Hoge_Ex();
    h.execute();
  }
}

abstract class Hoge {
  public void first(){ System.out.println("親の処理(みんなで共通 前処理)"); }
  abstract public void second();
  public void third(){ System.out.println("親の処理(みんなで共通 後処理)"); }
  public void execute(){ first(); second(); third(); }
}

class Hoge_Ex extends Hoge {
  public void second(){ System.out.println("ここは共通じゃないので子クラスで実装");}
}

結果:

親の処理(みんなで共通 前処理)
ここは共通じゃないので子クラスで実装
親の処理(みんなで共通 後処理)

子クラスの名前を考えるのがうっとうしいなら

無名クラスを生成
public class Main {
  public static void main(String args[]) {
    Hoge h = new Hoge(){ 
                public void second(){
                  System.out.println("ここは共通じゃないので子クラスで実装"); 
                }
             };
    h.execute();
  }
}

abstract class Hoge {
  public void first(){ System.out.println("親の処理(みんなで共通 前処理)"); }
  abstract public void second();
  public void third(){ System.out.println("親の処理(みんなで共通 後処理)"); }
  public void execute(){ first(); second(); third(); }
}

インスタンス名を考えるのもうっとうしい場合は

無名クラスをそのまま実行
public class Main {
  public static void main(String args[]) {
    new Hoge(){ 
      public void second(){
        System.out.println("ここは共通じゃないので子クラスで実装"); 
      }
    }.execute();
  }
}

abstract class Hoge {
  public void first(){ System.out.println("親の処理(みんなで共通 前処理)"); }
  abstract public void second();
  public void third(){ System.out.println("親の処理(みんなで共通 後処理)"); }
  public void execute(){ first(); second(); third(); }
}