テンプレートメソッド(分離)と戦略パターンの違いは?
-
22-09-2019 - |
質問
私の先生は本当に良いものであり、私は彼のポイントを理解する傾向がありますが、これはちょうど私の頭を越えています。彼は、2つのバリエーションでテンプレートメソッドを説明しています。
- 統合:標準バリアントは、それ以外の場合は固定アルゴリズムのバリアント部分を定義するいくつかの抽象的なメソッドを備えた抽象クラスで構成されています。
- 分離:クラスにtemplatemethod()が含まれており、インターフェイスに委任を使用してアルゴリズムの部分を変化させる場所で、彼自身のバリアント(私は思う?)。戦略パターンとまったく同じように見えます。
誰もが彼のポイントが何であるか、そして「分離」バリアントが戦略パターンとどのように異なるかを見ることができますか?
彼の本の2つのパターンを含む画像を添付しました(まだ公開されていません)。
解決
テンプレートメソッドパターンの「分離バリアント」を聞いたことはありません。戦略に非常に似ているように見えることに同意します。インターフェイスの所有権や、クライアントの観点からそれらを呼び出す方法について何らかの理由がある場合でも、それらを異なるパターンと考える利点はほとんどありません。
他のヒント
一般的な使用法では、テンプレートメソッドが使用します サブクラス さまざまな動作を提供します。戦略で、あなた 注射 アルゴリズムオブジェクト。あなたの例では、間に有用な区別はありません テンプレート(分離) と ストラテジー。 ガンマの時代を考えると et al この新しい用語を紹介する本を紹介して、違いを適切に説明することは、他のプログラマーと話すときに単に混乱を引き起こす可能性が高いです。レッスン以外で使用しないでください。
テンプレートを使用すると、ベースクラスの保護されたメンバーにアクセスできます。戦略を使用すると、それらを使用するオブジェクトからより失われたアルゴリズムを開発することができ、同じアルゴリズムを多くの異なるタイプのオブジェクトに注入することができます。
テンプレートメソッド:
- それは行動設計パターンです
- メソッドスタブを作成し、実装のいくつかのステップをサブクラスに延期するために使用されます。順序が修正された特定の手順で構成されています。
- アルゴリズムを実行する手順を定義し、すべてまたは一部のサブクラスに共通する可能性のあるデフォルトの実装を提供できます。
- サブクラスからのスーパークラステンプレートメソッド呼び出しメソッド、
戦略パターン:
- それは行動パターンです
- 委任に基づいています
- メソッドの動作を変更することにより、オブジェクトの内臓を変更します
- アルゴリズムのファミリを切り替えるために使用されます
- 実行時にオブジェクトの動作を変更します。 1つのアルゴリズムがアルゴリズムファミリーから選択されます。
基本的な違い。
- テンプレートメソッド 継承を使用します ストラテジー 構成を使用します
- テンプレートメソッド 基本クラスによって実装されることは、オーバーライドされるべきではありません。 このように、アルゴリズムの構造はスーパークラスによって制御されます, 、 そしてその 詳細はサブクラスに実装されています
- ストラテジー インターフェイスの背後にあるアルゴリズムをカプセル化し、実行時にアルゴリズムを変更する機能を提供します。複数の戦略は、インターフェイスに異なる実装を提供します。
JournalDevをご覧ください テンプレートメソッド と ストラテジー 一緒によりよく理解するための記事 ソースメイキング 記事。