Javaでのテンプレートメソッドデザインパターン

Template Methodは行動設計パターンです。Template Methodデザインパターンは、メソッドスタブを作成し、実装の一部をサブクラスに延期するために使用されます。

Template Method Design Pattern

Templateメソッドは、アルゴリズムを実行する手順を定義し、すべてまたは一部のサブクラスに共通するデフォルトの実装を提供できます。このパターンを例で理解しましょう。家を建てるアルゴリズムを提供したいとします。家を建てるために実行する必要がある手順は、基礎を築く、柱を築く、壁と窓を築くです。重要な点は、実行の順序を変更できないことです。なぜなら、基礎を築く前に窓を作ることはできないからです。したがって、この場合、家を建てるための異なるメソッドを使用するテンプレートメソッドを作成できます。家の基礎を築くことは、木造家屋でもガラスの家でも同じです。したがって、これに対する基本的な実装を提供できます。サブクラスがこのメソッドをオーバーライドしたい場合はできますが、ほとんどの場合、すべての種類の家に共通です。サブクラスがテンプレートメソッドをオーバーライドしないようにするためには、それを最終的にする必要があります。

Template Method Abstract Class

サブクラスでいくつかのメソッドを実装したいので、基本クラスを抽象クラスにする必要があります。 HouseTemplate.java

package com.journaldev.design.template;

public abstract class HouseTemplate {

	//テンプレートメソッド、サブクラスがオーバーライドできないようにfinal
	public final void buildHouse(){
		buildFoundation();
		buildPillars();
		buildWalls();
		buildWindows();
		System.out.println("House is built.");
	}

	//デフォルトの実装
	private void buildWindows() {
		System.out.println("Building Glass Windows");
	}

	//サブクラスで実装するメソッド
	public abstract void buildWalls();
	public abstract void buildPillars();

	private void buildFoundation() {
		System.out.println("Building foundation with cement,iron rods and sand");
	}
}

buildHouse()はテンプレートメソッドであり、複数のステップを実行するための実行順序を定義します。

テンプレートメソッド具象クラス

異なるタイプの家を持つことができます。例えば、木製の家やガラス製の家です。WoodenHouse.java

package com.journaldev.design.template;

public class WoodenHouse extends HouseTemplate {

	@Override
	public void buildWalls() {
		System.out.println("Building Wooden Walls");
	}

	@Override
	public void buildPillars() {
		System.out.println("Building Pillars with Wood coating");
	}

}

他のメソッドもオーバーライドできますが、シンプルにするためにそれは行っていません。GlassHouse.java

package com.journaldev.design.template;

public class GlassHouse extends HouseTemplate {

	@Override
	public void buildWalls() {
		System.out.println("Building Glass Walls");
	}

	@Override
	public void buildPillars() {
		System.out.println("Building Pillars with glass coating");
	}

}

テンプレートメソッドデザインパターンクライアント

テストプログラムでテンプレートメソッドパターンの例を試してみましょう。HousingClient.java

package com.journaldev.design.template;

public class HousingClient {

	public static void main(String[] args) {
		
		HouseTemplate houseType = new WoodenHouse();
		
		//テンプレートメソッドを使用
		houseType.buildHouse();
		System.out.println("************");
		
		houseType = new GlassHouse();
		
		houseType.buildHouse();
	}

}

クライアントがベースクラスのテンプレートメソッドを呼び出し、異なるステップの実装に依存していることに注意してください。それはベースクラスのメソッドとサブクラスのメソッドの両方を使用しています。上記のプログラムの出力は次のとおりです:

Building foundation with cement,iron rods and sand
Building Pillars with Wood coating
Building Wooden Walls
Building Glass Windows
House is built.
************
Building foundation with cement,iron rods and sand
Building Pillars with glass coating
Building Glass Walls
Building Glass Windows
House is built.

テンプレートメソッドクラス図

JDKのテンプレートメソッドデザインパターン

  • java.io.InputStream、java.io.OutputStream、java.io.Reader、java.io.Writerのすべての非抽象メソッド。java.util.AbstractList、java.util.AbstractSet、java.util.AbstractMapのすべての非抽象メソッド。

テンプレートメソッドデザインパターンの重要なポイント

  1. テンプレートメソッドは、順序が固定された特定のステップで構成され、いくつかのメソッドの実装がベースクラスからサブクラスに異なる場合があります。テンプレートメソッドは最終的であるべきです。
  2. ほとんどの場合、サブクラスはスーパークラスのメソッドを呼び出しますが、テンプレートパターンでは、スーパークラスのテンプレートメソッドがサブクラスのメソッドを呼び出します。これはハリウッドの原則として知られています-「電話はいりません、私たちから電話があります。」。
  3. デフォルト実装の基本クラスのメソッドはフックと呼ばれ、サブクラスによってオーバーライドされることを意図しています。メソッドの一部をオーバーライドしないようにしたい場合は、それらを最終的にすることができます。たとえば、私たちの場合、buildFoundation()メソッドを最終的にすることができます。サブクラスがそれをオーバーライドしない場合。

これで、Javaのテンプレートメソッドデザインパターンについての説明は以上です。気に入っていただけたら幸いです。

Source:
https://www.digitalocean.com/community/tutorials/template-method-design-pattern-in-java