質問

私はこれらのデザインパターンについて学んだばかりのクラスにいます。しかし、私はそれらの間に違いを見ることができませんでした。それらは同じように聞こえ、抽象クラスの上に具体的なクラスを作成します。誰かが私がこの疑いを殺すのを手伝ってくれますか?ありがとう (:

役に立ちましたか?

解決

訪問者、戦略、およびテンプレートパターンの両方が、アルゴリズムの適用を網羅しています。最大の違いは、それらがどのように誘発されるか、そして実際にどのように使用されるかです。同じユースケースを持っているように見えるかもしれませんが、違いを見るためにオブジェクトの構築を見てください。

戦略パターンは、ファーストクラスのオブジェクトとして関数を渡す機能がない場合によく使用されます。非常に具体的な引数リストが予想され、そのコールパターンの引数リストのみが期待されます。例えば:

struct MyStrat{
    void operator()(const Foo &_input){
        _input.up( 2 );
    }
};

std::for_each( myFooList.begin(), myFooList.end(), MyStrat() );

次に、タイプ「foo」のオブジェクトのリストに適用されます。他のオブジェクトに適用する他の方法は本当にありません。

一方、訪問者のパターンは、同じ署名を共有したり、同じメンバー関数を持っていない可能性のあるオブジェクトの束にアルゴリズムを適用したい場合に使用されます。訪問者のパターンは、ツリーや「無関係な」オブジェクトの別のコレクションを横断するときによく使用されるため、訪問者のパターンを言います(相続の意味では無関係です)。

struct MyVisitor{
    void visit(const Foo &_input){
         _input.up( 2 );
    }
    void visit(const Bar &_input){
         _input.raiseUp( 2 );
    }
    void visit(const Baz &_input){
         _input.setUp( 2 );
    }
 };

ここで、アイデアは、これらすべてのオブジェクトを「アップ」したいということです。それらはすべて同じメンバー関数の署名を共有していませんが、すべて概念的に関連しています。したがって、これらのクラスのそれぞれに「アクセス」できますが、アルゴリズムが同じタイプのタスクを実行することを期待できます。

訪問者パターンを使用することにより、各クラスをプロキシパターンでラップする必要性を避けます。したがって、nクラスの場合、このアルゴリズムを適用して、nプロキシクラスを作成する必要はありません。訪問者クラスにNメソッドを追加するだけです。

テンプレートメソッドは、訪問者と戦略パターンのいずれかとはまったく異なります。テンプレートを使用しようとしていることは、同じタイプのアルゴリズムを強制することですが、階層内の異なるサブクラスを使用します。例えば:

class Duck{
public:
    int count() =0;
    void makeNoise(int times) =0;
    void quack(){ makeNoise( count() ); }//the template pattern is here
};

class Mallard : public Duck{
public:
    int count(){ return 4; }
    void makeNoise( cout << "quack" << endl; }
};

class Daffy{
public:
    int count(){ return 1; }
    void makeNoise( cout << "Why I ought to..." << endl; }
};

したがって、アルゴリズムの結果は、継承内で異なります。

他のヒント

共通点:

  1. 戦略、テンプレートの方法、訪問者 :3つのパターンはすべて、行動パターンに分類されます。

違い:

  1. テンプレートメソッド 継承を使用します ストラテジー 構成を使用します
  2. テンプレートメソッド 基本クラスによって実装されることは、オーバーライドされるべきではありません。 このように、アルゴリズムの構造はスーパークラスによって制御され、詳細はサブクラスに実装されています
  3. ストラテジー インターフェイスの背後にあるアルゴリズムをカプセル化し、実行時にアルゴリズムを変更する機能を提供します
  4. ビジター パターンは、同様の種類のオブジェクトのグループで操作を実行するために使用されます。訪問者パターンの助けを借りて、オブジェクトからオブジェクトから別のクラスに動作するロジックを移動できます
  5. 操作の実装に変更がある場合、変更するだけです ビジター 他のすべてのオブジェクトに触れる代わりにクラス。

見て テンプレートメソッド , ストラテジービジターソースメイキング より良い理解のための記事。

関連記事:

訪問者のデザインパターンをいつ使用する必要がありますか?

戦略パターンの現実世界の例

JDKのテンプレート設計パターンは、順番に実行するメソッドのセットを定義するメソッドを見つけることができませんでした

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top