15

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

4

2 に答える 2

25

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

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

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; }
};

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

于 2010-11-24T12:38:48.523 に答える