LoginSignup
0
0

More than 1 year has passed since last update.

Template Method Pattern

Last updated at Posted at 2023-03-06

Template Method

abstract methodや実装されたmethodを活用して、全体の流れ(シナリオ)を定義しておいたメソッド、 finalで宣言し、再定義できなくします。

Template Method Pattern

Design Patternの一種です。 frameworkで多く使用される設計パターンです。 abstractクラスである上位クラスで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 以外にもあります。)

0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0