Template Method - pattern を使用する必要がある状況の例を誰か教えてもらえますか?
あなた自身の経験から、実際の使用方法を教えてください。
(これまでのところ、DA レイヤーでデータをマッピングする場合にのみ有用であることがわかりました。申し訳ありません!!!)
Template Method - pattern を使用する必要がある状況の例を誰か教えてもらえますか?
あなた自身の経験から、実際の使用方法を教えてください。
(これまでのところ、DA レイヤーでデータをマッピングする場合にのみ有用であることがわかりました。申し訳ありません!!!)
Template メソッド パターンは、あらゆる種類のアルゴリズムまたは操作を実行するためのスケルトンを提供し、サブクラスがロジックの一部を再定義できるようにします。
長所: フレームワークの構築に自然に適合するため、親フレームワーク クラスは、子に実装されたメソッドへのコールバックを作成できます。
例:
短所: Java で単一の継承に制限されます。
Template Methodパターンの適用には、次の 2 つの主な特徴があります。
protected
コンストラクターのみを持ち、オプションで として宣言されるクラス) があります。abstract
final
Java では )。その API ドキュメントでは、呼び出すプリミティブ操作メソッドとそのタイミングを正確に指定する必要があります (つまり、「アルゴリズム」を記述する必要があります)。アルゴリズムのステップを表すプリミティブ操作メソッドは、非公開にする必要がありますが、オーバーライド可能にする必要があります (protected
、Java で)、次の 2 つのタイプがあります。a)サブクラスで実装する必要がある抽象メソッド。b)サブクラスでオーバーライドできるデフォルト/空の実装を持つメソッド。Java 6 SDK の 1 つの良い例はexecute()
、javax.swing.SwingWorker
クラスのメソッド (public final void
メソッドです) です。この場合、プリミティブな操作方法はdoInBackground()
、process(List)
、およびdone()
です。最初のものは抽象的であるため、サブクラスでの実装が必要です。バックグラウンド スレッドでテンプレート メソッドによって呼び出されます。他の 2 つは空の実装を持ち、オプションでサブクラスでオーバーライドできます。これらは、UI の更新を可能にするために、EDT (Swing Event Dispatch Thread) で処理中および処理の最後にそれぞれ呼び出されます。
私自身の経験では、このパターンを時々使用しました。java.util.Iterator
そのようなケースの 1 つは、インターフェースを実装する Java 基本クラスでした。next()
はテンプレート メソッドであり、特定のドメイン エンティティ クラスのインスタンス化を担当するプリミティブ操作メソッドは 1 つだけでした (これは、JDBC を使用して、永続的なドメイン エンティティ オブジェクトのリストを反復処理するときに使用することを意図していました)。その同じアプリケーションのより良い例は、テンプレート メソッドが永続エンティティの特定のリストから「ビジネス エンティティ メンテナンス画面」(Swing を使用) に入力することを目的としたマルチステップ アルゴリズムを実装した基本クラスです。プリミティブ操作メソッドは、1) 現在の画面状態をクリアし、2) 画面内のテーブル ビューにエンティティを追加するために呼び出されました。オプションで、画面が編集可能な場合、他のプリミティブ操作がテンプレート メソッドから呼び出されました。
最後に、これは確かに有用な設計パターンですが、実際に適用できる状況はそう多くはありません。サブクラスでオーバーライドされるメソッドを持つ基底クラスを持つだけでは (私の経験では、はるかに一般的な状況です)、それ自体では、パターンのアプリケーションとしての資格を得るには十分ではありません。
テンプレートメソッドで最も重要なことは、一連の抽象メソッドをステップまたはアルゴリズムとして定義し、サブクラスをそれらのメソッドの具体的な実装に置き換える必要があることです。
ドキュメント生成プログラムの 1 つに応募しました。
public abstract DocumentGenerator()
{
generateHeader();
generateBody();
generateDetails();
}
public HTMLDocGenerator : DocumentGenerator()
{
public override generateBody()
{
//generate as in html format
}
}
PDFジェネレーターcsvジェネレーターのようなさまざまな実装を使用できます。ここでの値は、アルゴリズムに準拠しています(生成->ヘッダー、本文、詳細)。
多くの実装を持つアルゴリズムがある場合は、テンプレート パターンを使用する必要があります。アルゴリズムは基本クラスの関数で定義され、実装は基本クラスとサブクラスによって行われます。リアルタイムの例を含む詳細な説明は、http://preciselyconcise.com/design_patterns/templatemethod.phpにあります。
いくつかのテンプレート メソッドを利用した実際の例を 1 つスケッチします。
C++ コンピューター ビジョン アルゴリズム アプリケーションでは、アルゴリズムの動作は、起動時に読み込まれる構成ファイルに含まれる列挙型に従って、実行時に読み込まれるいくつかのオプションに基づいて、アルゴリズムの動作のいくつかのフレーバーを想定するように設計されています。アルゴリズムの全体的な骨組みは同じでしたが、そのレベルで異なる関数を呼び出すためだけに残忍に複製されたコードの同一セクションの真ん中にいくつかの主要なコールバックが詰め込まれていました。私が使用したかったこれらのコールバックは、テンプレート メソッドの基本クラスに抽象化され、テンプレート メソッド パターンによってコードの重複がすべて防止されました。基本的に、使用した列挙型は、基本クラス ポインターが指すインスタンス化したサブクラスを決定し、アルゴリズムに関連する動作のフレーバーを与えます。
実行中のアルゴリズムのこのようなさまざまなフレーバーの背後にある動機の一部は、計測器を制御するソフトウェアのオンライン機能とオフライン機能でした。オフライン フレーバーは、より豊富なデバッグ/診断出力を引き出し、一部の画像ピクセルに対してローカルな座標系を維持しましたが、オンライン フレーバーは、物事を絶対座標空間に保持し、すべてのロボット工学などを含む実行中の機器に固有の懸念を維持しました。別の列挙型は、一部の機械学習にも使用した一連の分類子の中から選択を行いました。これは、別の分類子が、別の方法ではコード本体を同じように流れるが、方法に関するいくつかの管理条件に基づいて異なる方法で解釈する必要がある、異なるデータ セットの下でトレーニングされたためです。そのデータが作成されました。
この種の使用例は、中間の問題と呼ばれるものから生じたものだと思います。
多くのコンポーネントが同じプロセスを共有するビジネス ロジックのテンプレート メソッドを使用しましたが、実装は少し異なりました。
この記事では、テンプレート パターンの 6 つの一般的な使用法について説明します。ADO.NET の時代には、 open 、 executequery 、 close connection などの固定シーケンスがあったため、テンプレート パターンを多く使用していましたが、executequery では、テーブル構造が異なるとクエリが異なります。 .
https://www.codeproject.com/Articles/307452/common-use-of-Template-Design-pattern-Design-pat
上記の記事では、テンプレート パターンの 6 つの一般的な用途について説明しています:-