1. ホーム
  2. design-patterns

[解決済み] テンプレート方式とストラテジーパターンの違いは何ですか?

2022-04-14 06:19:18

質問

テンプレートメソッドパターンとストラテジーパターンの違いについて教えてください。

私が知る限り、この2つは99%同じです。 テンプレートメソッドパターンは、抽象クラスをベースにしていること。 ストラテジークラスは、実装されるインターフェイスを使用します。 を、それぞれの具象ストラテジークラスが担当します。

しかし クライアント は、まったく同じように消費されるのでしょうか?

どのように解決するのですか?

両者の大きな違いは、具体的なアルゴリズムを選択する場合です。

を使用すると テンプレートメソッドパターン で発生します。 コンパイル時 によって サブクラス化 テンプレートです。 各サブクラスは、テンプレートの抽象メソッドを実装することで、異なる具象アルゴリズムを提供します。 クライアントがテンプレートの外部インターフェースのメソッドを呼び出すと,テンプレートは必要に応じてその抽象メソッド(内部インターフェース)を呼び出し,アルゴリズムを呼び出します.

class ConcreteAlgorithm : AbstractTemplate
{
    void DoAlgorithm(int datum) {...}
}

class AbstractTemplate
{
    void run(int datum) { DoAlgorithm(datum); }

    virtual void DoAlgorithm() = 0; // abstract
}

これに対して Strategyパターン でアルゴリズムを選択することができます。 ランタイム によって 封じ込め . 具体的なアルゴリズムは別のクラスや関数で実装され、ストラテジのコンストラクタやセッターメソッドにパラメータとして渡されます。 このパラメータにどのアルゴリズムが選ばれるかは、プログラムの状態や入力に応じて動的に変化することがあります。

class ConcreteAlgorithm : IAlgorithm
{
    void DoAlgorithm(int datum) {...}
}

class Strategy
{
    Strategy(IAlgorithm algo) {...}

    void run(int datum) { this->algo.DoAlgorithm(datum); }
}

まとめると

  • テンプレートメソッドのパターンです。 コンパイル時 によるアルゴリズム選択 サブクラス化
  • ストラテジーパターン 実行時アルゴリズム による選択 封じ込め