5

4 つのアルゴリズムのいずれかを使用できるクラスを作成したいと考えています (使用するアルゴリズムは実行時にしかわかりません)。Strategy 設計パターンは適切に聞こえると考えていましたが、私の問題は、各アルゴリズムがわずかに異なるパラメーターを必要とすることです。戦略を使用するのは悪い設計ですが、関連するパラメーターをコンストラクターに渡しますか?

以下に例を示します (簡単にするために、考えられるアルゴリズムが 2 つしかないとしましょう) ...

class Foo
{
private:
   // At run-time the correct algorithm is used, e.g. a = new Algorithm1(1);
   AlgorithmInterface* a; 

};

class AlgorithmInterface
{
public:
   virtual void DoSomething() = 0;
};

class Algorithm1 : public AlgorithmInterface
{
public:
   Algorithm1( int i ) : value(i) {}
   virtual void DoSomething(){ // Does something with int value };
   int value;   
};

class Algorithm2 : public AlgorithmInterface
{
public:
   Algorithm2( bool b ) : value(b) {}
   virtual void DoSomething(){ // Do something with bool value };
   bool value;   
};
4

6 に答える 6

7

ストラテジーパターンはインターフェイスの定義を要求し、それを実装するクラスは、その構築方法に関係なく、ストラテジーコードを実行するための有効な候補であるため、これは有効な設計になります。

于 2010-06-02T20:44:26.830 に答える
2

あなたはこのアプローチを正しく行っています。はい、これが戦略パターンの本質です... 「実装に関係なくアルゴリズムを変更してください。」 オブジェクト配列など、クラスを初期化するために必要なパラメーターを渡すためのジェネリックコンストラクターを自分に与えることができます。

楽しみ!

于 2010-06-02T20:48:50.127 に答える
2

新しい戦略を作成するときに必要なすべてのパラメーターがあり、コードを読んでいるすべての人にとって何をするかが明確であれば、それは正しいと思います。

于 2010-06-02T20:42:20.937 に答える
1

戦略パターンは、使用するアルゴリズムを実行時に決定する場合に役立ちます。

于 2010-09-21T03:37:00.587 に答える
0

キーと値のペアを含むメモリブロックの単一のインターフェイスを使用してパラメータを渡すこともできます。このようにして、インターフェースは現在のアルゴリズムと将来のアルゴリズムの間で共通になります。各アルゴリズムの実装は、キーと値のペアをパラメーターにデコードする方法を知っています。

于 2010-06-02T20:43:31.943 に答える
0

IMHO、具体的なアルゴリズムの作成面と実際のアルゴリズムの実行を混同しているため、課題に直面しています。'DoSomething'インターフェイスが同じままである限り、Strategy Pattern使用できます。Factory Method設計パターンを通じて処理できるのは、ケースによって異なる具体的なアルゴリズムの作成のみです。

于 2010-09-21T04:44:51.617 に答える