テンプレートモード


テンプレート パターンでは、抽象クラスがそのメソッドを実行する方法/テンプレートをパブリックに定義します。そのサブクラスは必要に応じてメソッド実装をオーバーライドできますが、呼び出しは抽象クラスで定義された方法で行われます。このタイプの設計パターンは動作パターンです。

はじめに

目的: 一部のステップをサブクラスに延期しながら、アルゴリズムのスケルトンを 1 つの操作で定義します。テンプレート メソッドを使用すると、アルゴリズムの構造を変更せずに、サブクラスでアルゴリズムの特定のステップを再定義できます。

主な解決策: 一部のメソッドは共通ですが、このメソッドはすべてのサブクラスで書き換えられます。

いつ使用するか: 一般的な方法がいくつかあります。

解決方法: これらの一般的なアルゴリズムを抽象化します。

キーコード: 抽象クラスで実装され、他のステップはサブクラスで実装されます。

応用例: 1. 家を建てるとき、基礎、配線、水道管は同じですが、クローゼットやフェンスの追加など、建設の後期のみ異なります。 2. 『西遊記』で菩薩が設定した 81 の難は、最上位の論理枠組みです。 3. Spirng での Hibernate のサポートは、トランザクションの開始、セッションの取得、セッションの終了など、いくつかの所定のメソッドをカプセル化します。プログラマは標準化されたコードを繰り返し記述する必要がなく、エンティティをスローするだけでコードを保存できます。

利点: 1. 定数部分をカプセル化し、可変部分を展開します。 2. メンテナンスを容易にするためにパブリック コードを抽出します。 3. 動作は親クラスによって制御され、サブクラスによって実装されます。

短所: 異なる実装ごとに実装するサブクラスが必要となるため、クラスの数が増加し、システムが大きくなります。

使用シナリオ: 1. 同じロジックを持つ複数のサブクラスに共通のメソッドがあります。 2. 重要かつ複雑なメソッドは、テンプレート メソッドとして考慮できます。

注: 悪意のある操作を防ぐために、通常、final キーワードがテンプレート メソッドに追加されます。

実装

操作を定義する

Game抽象クラスを作成します。テンプレートメソッドはオーバーライドされないようにfinalに設定されます。 CricketFootballGame を拡張するエンティティ クラスであり、抽象クラスのメソッドをオーバーライドします。

TemplatePatternDemo、私たちのデモクラスはGameを使用してテンプレートパターンの使用法を示します。

template_pattern_uml_diagram.jpgステップ 1

テンプレート メソッドを Final に設定して抽象クラスを作成します。

Game.java

public abstract class Game {
   abstract void initialize();
   abstract void startPlay();
   abstract void endPlay();

   //模板
   public final void play(){

      //初始化游戏
      initialize();

      //开始游戏
      startPlay();

      //结束游戏
      endPlay();
   }
}

ステップ2

上記のクラスを拡張するエンティティクラスを作成します。

Cricket.java

public class Cricket extends Game {

   @Override
   void endPlay() {
      System.out.println("Cricket Game Finished!");
   }

   @Override
   void initialize() {
      System.out.println("Cricket Game Initialized! Start playing.");
   }

   @Override
   void startPlay() {
      System.out.println("Cricket Game Started. Enjoy the game!");
   }
}

Football.java

public class Football extends Game {

   @Override
   void endPlay() {
      System.out.println("Football Game Finished!");
   }

   @Override
   void initialize() {
      System.out.println("Football Game Initialized! Start playing.");
   }

   @Override
   void startPlay() {
      System.out.println("Football Game Started. Enjoy the game!");
   }
}

ステップ 3

Game のテンプレート メソッド play() を使用して、ゲームがどのように定義されているかを示します。

TemplatePatternDemo.java

public class TemplatePatternDemo {
   public static void main(String[] args) {

      Game game = new Cricket();
      game.play();
      System.out.println();
      game = new Football();
      game.play();		
   }
}

ステップ 4

出力を確認します。

りー