設計モード:テンプレートメソッドモード(Template Method)


テンプレートメソッドモード:操作中のアルゴリズムのスケルトンを定義し、いくつかのステップをサブクラスに遅延します.TemplateMethodは、サブクラスがアルゴリズムの構造を変更することなく、アルゴリズムの特定のステップを再定義できるようにする.アルゴリズムの不変部分を一度に実装し,可変挙動をサブクラスに残して実装した.
 テンプレートメソッドの鍵は、サブクラスが親の可変部分を置換できるが、サブクラスはテンプレートメソッドが表すトップレベルの論理を変更できないことです.テンプレートメソッドモードのメソッドは、テンプレートメソッドと基本メソッドの2つに分類できます.
1テンプレートメソッド1つの抽象クラスには、1つに限らず、任意の複数のテンプレートメソッドがあり得る.各テンプレートメソッドは、任意の複数の特定のメソッドを呼び出すことができます.
2基本メソッドの基本メソッドは、抽象メソッド(Abstract Method)、具体的なメソッド(Concrete Method)、フックメソッドの3つに分けることができます. 抽象メソッド:抽象メソッドは抽象クラスによって宣言され、特定のサブクラスによって実現されます. 具体的な方法:1つの具体的な方法は抽象クラスによって宣言され、実現されるが、サブクラスは実現または置換されない.フックメソッド:抽象クラスによって宣言され、実装され、サブクラスが拡張されます.通常、抽象クラスが与える実装は、メソッドのデフォルト実装として空の実装である.この空のフックの方法を「Do Nothing Hook」といいます.フックメソッドの名前はdoで始まるべきで、これは設計モデルに詳しいJava開発者の標準的なやり方です.たとえばHttpServeretクラスでも,doGet,doPostなどの命名規則に従う.HttpServiceletではテンプレートメソッドはサービス()メソッド,基本メソッドはdoPost()doGet()などのメソッドが担当する.
ケース1 AbstractClass
public abstract class AbstractTemplate
{
    public void templateMethod(){
        abstractMethod();
        doHookMethod();
        concreteMethod();
    }

    protected abstract void abstractMethod();
    protected void doHookMethod(){}
    protected final void concreteMethod(){
        System.out.println("invoke concreteMethod");
    };
}

2 ConcreteClass
public class ConcreteTemplate extends AbstractTemplate {
    @Override
    protected void abstractMethod()
    {
        System.out.println("ConcreteTemplate-abstractMethod");
    }

    @Override
    public void doHookMethod()
    {
        System.out.println("ConcreteTemplate-doHookMethod");
    }
}

参考資料1.23種類のデザインパターン2.『JAVAとモード』のテンプレートメソッドモード