Java のテンプレート メソッド パターンは、アルゴリズムのフレームワークを定義し、アルゴリズムの構造を変更せずにサブクラスが特定のステップを書き換えることを可能にするために使用される動作設計パターンです。
このモードは、オープン/クローズの原則に基づいています。つまり、拡張にはオープンで、変更にはクローズです。テンプレート メソッド モードでは、親クラスがアルゴリズムのスケルトンを定義し、サブクラスは次の方法で特定の関数をカスタマイズできます。親クラスの抽象メソッドを実装します。ステップの動作およびアルゴリズム ステップ全体は、サブクラスの変更によって変更されません。
テンプレート メソッド パターンには、通常、抽象クラスといくつかの具象サブクラスが含まれます。抽象クラスいくつかの基本的なメソッドとテンプレート メソッドを含む、アルゴリズムのフレームワークを定義します。テンプレート メソッドは、アルゴリズムのステップを含むテンプレートです。各ステップは、抽象メソッドまたはデフォルト メソッドによって実装されます。特定のサブクラスは、独自の動作を実装できますこれらの抽象メソッドを実装することで、
抽象クラスにもフック関数を含めることができます。フック関数は通常、抽象クラスの仮想関数です。デフォルトの実装は空であるため、サブクラスは実装する関数をオーバーライドすることを選択できます。特定の動作。テンプレート メソッド パターンでは、フック関数は通常、特定の操作を実行したり、アルゴリズムの特定のステップで条件をチェックしたりするために使用されます。フック関数の別の用途は、アルゴリズムを拡張する方法を提供することです。サブクラスは、次の方法で追加のステップを追加できます。フック関数のオーバーライドまたはアルゴリズムの動作の変更。つまり、フック関数はテンプレート メソッド パターンの重要な概念であり、アルゴリズムの動作に影響を与えたり、アルゴリズムの機能を拡張したりするために使用できます。
最初にコーヒー抽象クラスを定義します
package com.fanqiechaodan.templatemethod; /** * @Classname CoffeeMaker * @Description 咖啡抽象类 */ public abstract class CoffeeMaker { public final void makeCoffee() { boilWater(); brewCoffee(); pourInCup(); if (isCondiments()) { addCondiments(); } } private void boilWater() { System.out.println("煮水"); } protected abstract void brewCoffee(); private void pourInCup() { System.out.println("倒入杯子中"); } /** * 钩子函数;是否加入调料,由子类决定是否重写 * * @return */ protected boolean isCondiments() { return true; } protected abstract void addCondiments(); }
次に2つの特定のサブクラスを定義します
public class AmericanoMaker extends CoffeeMaker{ @Override protected void brewCoffee() { System.out.println("冲泡美式咖啡"); } @Override protected void addCondiments() { System.out.println("加入牛奶和糖"); } /** * 钩子函数;是否加入调料,由子类决定是否重写 * * @return */ @Override protected boolean isCondiments() { return false; } } public class LatteMaker extends CoffeeMaker{ @Override protected void brewCoffee() { System.out.println("冲泡浓缩咖啡"); } @Override protected void addCondiments() { System.out.println("添加奶泡和焦糖酱"); } }
Test
package com.fanqiechaodan.templatemethod; /** * @author fanqiechaodan * @Classname Demo * @Description 模板方法模式 * @Date 2023/3/9 18:57 */ public class Demo { public static void main(String[] args) { CoffeeMaker americanoMaker = new AmericanoMaker(); americanoMaker.makeCoffee(); System.out.println(); CoffeeMaker latteMaker = new LatteMaker(); latteMaker.makeCoffee(); } }
以上がアルゴリズム フレームワークの定義と Java テンプレート メソッド パターンの使用法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。