1

私には3つのタイプのアルゴリズムがあり、それぞれが処理に必要な異なるパラメータータイプを取ります。

class AlgorithmA
{
    Execute(int param);
}

class AlgorithmB
{
    Execute(string param);
}

class AlgorithmC
{
    Execute();
}

MEFで戦略パターンを採用するために、私は次のことを行いました。

interface IAlgorithm
{
    int IntegerParam{get;set;}
    string StringParam{get;set;}
    string AlgorithmName {get;}
    void Execute();
}

とクライアントで:

[ImportMany]
IEnumerable<IAlgorithm> Algorithms { get; set; }

IAlgorithm algorithm=Algorithms.Single(a => a.AlgorithmName == name);
algorithm.IntegerParam=integerParam;
algorithm.StringParam=stringParam;
algorithm.Execute();

ここで問題は、必要なパラメーターをプロパティとして提供することは明らかに間違っていますが、一方で、コンストラクターパラメーターとして提供すると、パターンの目的そのものが無効になります。
あなたならどうしますか ?

4

2 に答える 2

1

戦略パターンは、実際に選択されたものに関係なく、同じパラメーターを戦略に渡す必要があります。次に、各戦略はこれらのパラメータをどうするかを決定する必要があります。

2つのパラメーターを渡す必要がある場合は、おそらく次のように定義する必要があります。

interface IAlgorithm
{
    string AlgorithmName {get;}
    void Execute(string paramA, int paramB);
}

algorithm.Execute(stringParam, intParam);

次に、特定の戦略が最初のパラメーターのみを使用する必要がある場合、それは単にそれを使用し、他のパラメーターを無視します。

私が見逃していると思うのは、さまざまなパラメータをさまざまな戦略に渡そうとすると、使用されている戦略、内部でどのように機能するか、そしてそれが何であるかについてすでに何かを知っているため、ここでの戦略をほとんどあきらめているということですニーズ。

于 2012-11-24T13:38:35.977 に答える
0

これはあなたの質問に対する解決策かもしれません:http ://www.hillside.net/plop/2010/papers/sobajic.pdf

于 2013-10-02T23:45:05.053 に答える