Template Method Pattern
Design Patternの一種です。 frameworkで多く使用される設計パターンです。 abstractクラスである上位クラスでfinalやabstract methodを使用して実装全体の流れを定義し、具体的な各メソッド実装は下位クラスに委任します。下位クラスが異なる実装をしたからといっても、template methodで定義されたシナリオどおりに実行されます。
Car.java
public abstract class Car {
// 下位クラスに強制します。
public abstract void drive();
public abstract void stop();
public void startCar() {
System.out.println("start car");
}
public void turnOff() {
System.out.println("turn off car");
}
public void washCar() { }
// template method!
final public void run() {
startCar();
drive();
stop();
turnOff();
washCar();
}
}
AIcar.java
public class AIcar extends Car{
@Override
public void drive() {
System.out.println("AI car drive");
}
@Override
public void stop() {
System.out.println("AI car stop");
}
@Override
public void washCar() {
System.out.println("AI car wash");
}
}
ManualCar.java
public class ManualCar extends Car{
@Override
public void drive() {
System.out.println("Manual Car drive");
}
@Override
public void stop() {
System.out.println("Manual Car drive");
}
}
Car abstractクラスのrun()はtemplate methodになります。
run()はいつも定義されている通りに実行されます。
下位クラスに実装を強制たいmethodはabstract methodとして定義しています。
public void washCar()は中身がないしabstractではありませんが、template methodの中に定義されています。
この場合は、これを必要とする下位クラスだけがoverrideして使ってもらえるように具現しています。
フレームワークの場合にも、フレームワークを導入して開発する時に、フレームワークの流れ(シナリオ)はすでに決まっていて、私が制御できるものではありません。
間間に私が具現したい方向にmethodを実装します。この時テンプレート・メソッドが活用されます。(template method 以外にもあります。)